Гость
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Опять расчет кол-ва рабочих дней между двумя датами. / 2 сообщений из 2, страница 1 из 1
28.02.2016, 12:16
    #39180764
bsa1959
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Опять расчет кол-ва рабочих дней между двумя датами.
Хочу поделиться своими измышлениями.
Собствеенно процедура.
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
SET TERM ^ ;

create or alter procedure BUSSINES_DAYS (
    START_DATE date,
    END_DATE date,
    WORKDAYS integer)
returns (
    RET integer)
as
declare variable TMP_DATE date;
declare variable DIFF1 integer;
declare variable DIFF2 integer;
begin
tmp_date = '08.01.1900';
diff2 = datediff(day from tmp_date to start_date);
diff1 = datediff(day from tmp_date to end_date);
ret = (workdays*floor(diff1/7)  + MINVALUE(workdays, MOD( diff1, 7 )+1))
    - (workdays*floor(diff2/7)  + MINVALUE(workdays, MOD( diff2, 7 )));
    if(workdays = 6) then
     diff1 = 7;
    else
     diff1 = 6;
-- Ищем праздничные и невыходные.
   select count(*) from prod_calendar where data between :start_date and :end_date and type = 0 and week_day < :diff1 into :diff2;
   ret = ret - diff2;
   if(workdays = 5) then
    begin
   -- Ищем переносы выходных.
     select count(*) from prod_calendar where data between :start_date and :end_date and type = 1 and week_day < :diff1 into :diff2;
     ret = ret - diff2;
   -- Ищем переносы рабочих дней.
     select count(*) from prod_calendar where data between :start_date and :end_date and type = 2 and week_day >= :diff1 into :diff2;
     ret = ret + diff2;
    end
  suspend;
end^

SET TERM ; ^



Для учета праздничных дней и учета переноса используется таблица:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
/******************************************************************************/
/***               Generated by IBExpert 28.02.2016 12:11:18                ***/
/******************************************************************************/

/******************************************************************************/
/***      Following SET SQL DIALECT is just for the Database Comparer       ***/
/******************************************************************************/
SET SQL DIALECT 3;



/******************************************************************************/
/***                                 Tables                                 ***/
/******************************************************************************/


CREATE GENERATOR GEN_PROD_CALENDAR_ID;

CREATE TABLE PROD_CALENDAR (
    DID       BIGINT NOT NULL,
    DATA      DATE NOT NULL,
    "TYPE"    SMALLINT NOT NULL,
    WEEK_DAY  SMALLINT
);




/******************************************************************************/
/***                              Primary keys                              ***/
/******************************************************************************/

ALTER TABLE PROD_CALENDAR ADD CONSTRAINT PK_PROD_CALENDAR PRIMARY KEY (DID);


/******************************************************************************/
/***                                Indices                                 ***/
/******************************************************************************/

CREATE INDEX PROD_CALENDAR_IDX1 ON PROD_CALENDAR (DATA);


/******************************************************************************/
/***                                Triggers                                ***/
/******************************************************************************/



SET TERM ^ ;



/******************************************************************************/
/***                          Triggers for tables                           ***/
/******************************************************************************/



/* Trigger: PROD_CALENDAR_BI */
CREATE OR ALTER TRIGGER PROD_CALENDAR_BI FOR PROD_CALENDAR
ACTIVE BEFORE INSERT OR UPDATE POSITION 0
as
begin
  if (new.did is null) then
    new.did = gen_id(gen_prod_calendar_id,1);
  new.week_day = extract(weekday from new.data);
  if (new.week_day = 0) then new.week_day = 7;
end
^

SET TERM ; ^



/******************************************************************************/
/***                          Fields descriptions                           ***/
/******************************************************************************/

COMMENT ON COLUMN PROD_CALENDAR.DID IS 
'Первичный ключ';

COMMENT ON COLUMN PROD_CALENDAR.DATA IS 
'Дата праздника или переноса';

COMMENT ON COLUMN PROD_CALENDAR."TYPE" IS 
'Тип даты
0 - праздник
1 - день стал выходным после переноса
2- день стал рабочим после переноса';

COMMENT ON COLUMN PROD_CALENDAR.WEEK_DAY IS 
'День недели - считается автоматом в триггере
1- понедельник, 2- вторник,...., 7- воскресенье';



До конца не выяснен процесс применения переносов к рабочей неделе с точки зрения законодательства в которой не 5 дней.
Поэтому переносы для них просто пока не учитывается....
Покритикуйте, please!
...
Рейтинг: 0 / 0
29.02.2016, 05:29
    #39181038
Граур Станислав
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Опять расчет кол-ва рабочих дней между двумя датами.
Это зарплата?
Если, да, то что делать со сменами, где люди работаю не по 8 часов в день, а например 8 8 8 8 8 4 ?
Имхо запрос по получению рабочих дней должен быть прост, нечто

Код: sql
1.
2.
3.
4.
5.
select count(t1.hours) as workDay, sum(t1.hours) as workTime
from calendar t1
where 
-- фильтр по датам
-- фильтр по нужному графику



P.S.
Меня устраивает вариант, который использует например 1С - это производственный календарь по годам,
и графики, которые строятся по этому календарю, редактируются пользователем и сохраняются.
...
Рейтинг: 0 / 0
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Опять расчет кол-ва рабочих дней между двумя датами. / 2 сообщений из 2, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]