powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Производственный или рабочий календарь
25 сообщений из 25, страница 1 из 1
Производственный или рабочий календарь
    #38385595
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Так как возникает иногда потребность, а реализации бывают разные, то предлагаю обсудить частный случай для FB и допилить совместными усилиями до совершенства.

Из таблицы вырезаны названия дней и месяцев, которые генерировались с помощью самописной UDF.

Таблица Calendar:
Код: sql
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.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
/******************************************************************************/
/***               Generated by IBExpert 03.09.2013 15:23:31                ***/
/******************************************************************************/

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

CREATE DOMAIN BOOL AS
NUMERIC(1,0)
DEFAULT 0
NOT NULL
CHECK (value in (0, 1));

COMMENT ON DOMAIN BOOL IS 
'Логическое';

CREATE DOMAIN CALENDARITEM AS
SMALLINT
NOT NULL;

CREATE DOMAIN DATEITEM AS
DATE
NOT NULL;

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



CREATE TABLE CALENDAR (
    VAL            DATEITEM /* DATEITEM = DATE NOT NULL */,
    DAY_OF_WEEK    CALENDARITEM /* CALENDARITEM = SMALLINT NOT NULL */,
    DAY_OF_MONTH   CALENDARITEM /* CALENDARITEM = SMALLINT NOT NULL */,
    DAY_OF_YEAR    CALENDARITEM /* CALENDARITEM = SMALLINT NOT NULL */,
    WEEK_OF_MONTH  CALENDARITEM /* CALENDARITEM = SMALLINT NOT NULL */,
    WEEK_OF_YEAR   CALENDARITEM /* CALENDARITEM = SMALLINT NOT NULL */,
    MONTH_OF_YEAR  CALENDARITEM /* CALENDARITEM = SMALLINT NOT NULL */,
    QUARTER        CALENDARITEM /* CALENDARITEM = SMALLINT NOT NULL */,
    YEAR_OF        CALENDARITEM /* CALENDARITEM = SMALLINT NOT NULL */,
    IS_LEAP        BOOL /* BOOL = NUMERIC(1,0) DEFAULT 0 NOT NULL CHECK (value in (0, 1)) */,
    IS_WORK_DAY    BOOL /* BOOL = NUMERIC(1,0) DEFAULT 0 NOT NULL CHECK (value in (0, 1)) */,
    IS_WEEKEND     BOOL /* BOOL = NUMERIC(1,0) DEFAULT 0 NOT NULL CHECK (value in (0, 1)) */,
    IS_HOLIDAY     BOOL /* BOOL = NUMERIC(1,0) DEFAULT 0 NOT NULL CHECK (value in (0, 1)) */
);




/******************************************************************************/
/***                              Primary Keys                              ***/
/******************************************************************************/

ALTER TABLE CALENDAR ADD CONSTRAINT PK_CALENDAR PRIMARY KEY (VAL);


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

CREATE INDEX CALENDAR_DOM ON CALENDAR (DAY_OF_MONTH);
CREATE INDEX CALENDAR_DOY ON CALENDAR (DAY_OF_YEAR);
CREATE INDEX CALENDAR_IH ON CALENDAR (IS_HOLIDAY);
CREATE INDEX CALENDAR_IL ON CALENDAR (IS_LEAP);
CREATE INDEX CALENDAR_IW ON CALENDAR (IS_WEEKEND);
CREATE INDEX CALENDAR_IWD ON CALENDAR (IS_WORK_DAY);
CREATE INDEX CALENDAR_MOY ON CALENDAR (MONTH_OF_YEAR);
CREATE INDEX CALENDAR_Q ON CALENDAR (QUARTER);
CREATE INDEX CALENDAR_DOW ON CALENDAR (DAY_OF_WEEK);
CREATE INDEX CALENDAR_WOM ON CALENDAR (WEEK_OF_MONTH);
CREATE INDEX CALENDAR_WOY ON CALENDAR (WEEK_OF_YEAR);
CREATE INDEX CALENDAR_YF ON CALENDAR (YEAR_OF);


/******************************************************************************/
/***                              Descriptions                              ***/
/******************************************************************************/

COMMENT ON TABLE CALENDAR IS 
'Календарь';



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

COMMENT ON COLUMN CALENDAR.VAL IS 
'Дата';

COMMENT ON COLUMN CALENDAR.DAY_OF_WEEK IS 
'День недели';

COMMENT ON COLUMN CALENDAR.DAY_OF_MONTH IS 
'День месяца';

COMMENT ON COLUMN CALENDAR.DAY_OF_YEAR IS 
'День года';

COMMENT ON COLUMN CALENDAR.WEEK_OF_MONTH IS 
'Неделя месяца';

COMMENT ON COLUMN CALENDAR.WEEK_OF_YEAR IS 
'Неделя года';

COMMENT ON COLUMN CALENDAR.MONTH_OF_YEAR IS 
'Месяц';

COMMENT ON COLUMN CALENDAR.QUARTER IS 
'Квартал';

COMMENT ON COLUMN CALENDAR.YEAR_OF IS 
'Год';

COMMENT ON COLUMN CALENDAR.IS_LEAP IS 
'Високосный год';

COMMENT ON COLUMN CALENDAR.IS_WORK_DAY IS 
'Рабочий день (пн-пт)';

COMMENT ON COLUMN CALENDAR.IS_WEEKEND IS 
'Выходной (сб, вс)';

COMMENT ON COLUMN CALENDAR.IS_HOLIDAY IS 
'Праздничный день';



/******************************************************************************/
/***                               Privileges                               ***/
/******************************************************************************/



Процедура по его заполнению:
Код: sql
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.
94.
95.
96.
97.
98.
99.
SET TERM ^ ;

create or alter procedure FILL_CALENDAR (
    IFROM DATEITEM,
    ITO DATEITEM)
as
declare variable VAL DATEITEM;
declare variable D DATEITEM;
declare variable DOW CALENDARITEM;
declare variable DOM CALENDARITEM;
declare variable DOY CALENDARITEM;
declare variable WOM CALENDARITEM;
declare variable WOY CALENDARITEM;
declare variable MOY CALENDARITEM;
declare variable Q CALENDARITEM;
declare variable YO CALENDARITEM;
declare variable IWD BOOL;
declare variable IW BOOL;
declare variable IH BOOL;
declare variable IL BOOL;
begin
  val = :ifrom;
  while (:val < :ito) do begin
    il = 0;
    iwd = 0;
    iw = 0;
    ih = 0;
    d = :val - EXTRACT(WEEKDAY FROM :val-1) + 3;
    dow = extract(weekday from :val); -- день недели
    dom = extract(day from :val); -- день месяца
    doy = extract(yearday from :val); -- день года
    wom = EXTRACT(day FROM :val)/7 + 1; -- неделя месяца
    woy = (EXTRACT(YEARDAY FROM :d) - EXTRACT(WEEKDAY FROM :d-1) + 7) / 7e0; -- неделя года
    moy = extract(month from :val); -- месяц
    q = (EXTRACT(MONTH FROM :val)-1)/3+1; -- квартал
    yo = extract(year from :val); -- год
    if ((:dow = 6)or(:dow = 7)) then iw = 1; else iwd = 1; -- выходные или рабочие
    IF ( 2 = EXTRACT(MONTH FROM (:val - EXTRACT(YEARDAY FROM :val) + 59)) ) THEN IL = 1; -- високосный

    -- определим некоторые праздничные дни
    if ((:moy = 1)and(:dow = 1)) then begin
      ih = 1; -- новый год
      iwd = 0; -- не рабочий
      iw = 1; -- выходной
    end
    else if ((:moy = 1)and(:dow = 7)) then begin
      ih = 1; -- рождество христово
      iwd = 0; -- не рабочий
      iw = 1; -- выходной
    end
    else if ((:moy = 2)and(:dow = 23)) then begin
      ih = 1; -- день защитника отечества
      iwd = 0; -- не рабочий
      iw = 1; -- выходной
    end
    else if ((:moy = 3)and(:dow = 8)) then begin
      ih = 1; -- международный женский день
      iwd = 0; -- не рабочий
      iw = 1; -- выходной
    end
    else if ((:moy = 5)and(:dow = 1)) then begin
      ih = 1; -- праздник весны и труда
      iwd = 0; -- не рабочий
      iw = 1; -- выходной
    end
    else if ((:moy = 5)and(:dow = 9)) then begin
      ih = 1; -- день победы
      iwd = 0; -- не рабочий
      iw = 1; -- выходной
    end
    else if ((:moy = 6)and(:dow = 12)) then begin
      ih = 1; -- день россии
      iwd = 0; -- не рабочий
      iw = 1; -- выходной
    end
    else if ((:moy = 11)and(:dow = 4)) then begin
      ih = 1; -- день народного единства
      iwd = 0; -- не рабочий
      iw = 1; -- выходной
    end

    update or insert into calendar(val, day_of_week, day_of_month, day_of_year, week_of_month, week_of_year, month_of_year,
        quarter, year_of, is_leap, is_work_day, is_weekend, is_holiday)
      values (:val, :dow, :dom, :doy, :wom, :woy, :moy, :q, :yo, :il, :iwd, :iw, :ih)
      matching (val);
    val = :val + 1;
  end
end
^

SET TERM ; ^

/* Following GRANT statetements are generated automatically */

GRANT SELECT,INSERT,UPDATE ON CALENDAR TO PROCEDURE FILL_CALENDAR;

/* Existing privileges on this procedure */

GRANT EXECUTE ON PROCEDURE FILL_CALENDAR TO SYSDBA;


Модератор: Процедура заменена по просьбе автора.
...
Рейтинг: 0 / 0
Производственный или рабочий календарь
    #38385671
Фотография DarkMaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadman,

Хм... Я храню только праздничные дни (в виде обычной даты) - т.к. они НЕ являются строго регламентируемыми и привязываются к конкретному предприятию. (Ну и также всякие переносы присутствуют). Все остальное считаю "на лету".
...
Рейтинг: 0 / 0
Производственный или рабочий календарь
    #38385687
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
DarkMasterВсе остальное считаю "на лету".
Значит у тебя нет потребности посмотреть динамику производства или продаж по дням недели/неделе/кварталу и т.п.
...
Рейтинг: 0 / 0
Производственный или рабочий календарь
    #38385692
Фотография DarkMaster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadman,

Предметная область другая...
...
Рейтинг: 0 / 0
Производственный или рабочий календарь
    #38386103
zeon11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadman,
1. Добавить первичный ключ
2. Добавить количество рабочих часов, ведь есть сезонные интервалы.
У нас, например, в Кузбассе, в огородный период, с май по сентябрь, для женщин по пятницам рабочий день короче на 1 час, а то и на два.
3. Связать календарь отношением M-to-M cо списком сотрудников, пусть у каждого будет свой календарь, где отмечать особые даты, отпуск, день рождения, дата приёма на работу и т.д.
4. сделать п.3 для отдела
5. Можно прикрутиь и TimeTable, типа ежедневника, тогда уже ТаймМенеджмент можно поднять. Начальство одобрит, а коллеги .... .
...
Рейтинг: 0 / 0
Производственный или рабочий календарь
    #38386150
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
zeon111. Добавить первичный ключ
PRIMARY KEY? Чуть кофе не поперхнулся. :)
zeon112. Добавить количество рабочих часов, ведь есть сезонные интервалы.
У нас производство за редким исключением круглосуточное, но в целом согласен в купе с п.4.
zeon113. Связать календарь отношением M-to-M cо списком сотрудников, пусть у каждого будет свой календарь, где отмечать особые даты, отпуск, день рождения, дата приёма на работу и т.д.
Не согласен: свойства элементов (день приема/рождения/увольнения), как и его исторические изменения (штрафы, отпуска, повышения/понижения, прогулы) не стоит пихать в календарь. И касательно моего случая количество календарей вырастет на несколько тысяч - тихий ужас.
zeon114. сделать п.3 для отдела
Предлагай свой вариант таблицы, так будет честно, т.к. у меня only производство и для него большего и не нужно.
zeon115. Можно прикрутиь и TimeTable, типа ежедневника, тогда уже ТаймМенеджмент можно поднять. Начальство одобрит, а коллеги .... .
Так же считаю, что это не для календаря. У нас, к примеру, для этого есть пропускная система на всех дверях.

zeon11, ты теоретизируешь, признайся? :)
...
Рейтинг: 0 / 0
Производственный или рабочий календарь
    #38386207
zeon11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadmanzeon11, ты теоретизируешь, признайся? :)

Угу, теоретизирую.....
...
Рейтинг: 0 / 0
Производственный или рабочий календарь
    #38386220
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
zeon11Угу, теоретизирую.....
Сколько у тебя строк в календаре на один год?
...
Рейтинг: 0 / 0
Производственный или рабочий календарь
    #38386222
oleg_m
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadman, не парься.
Самый универсальный календарь сделать наверно можно, но он будет излишне сложным для конкретных применений.
...
Рейтинг: 0 / 0
Производственный или рабочий календарь
    #38386264
zeon11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Про первичный ключ:
Я разглядел, что у тебя
ALTER TABLE CALENDAR ADD CONSTRAINT PK_CALENDAR PRIMARY KEY (VAL);
Но! первичный ключ по дате лишает тебя манёвра на случай, если ты захочешь иметь не один, а два или три календаря. Поясняю, например, в твоём предприятии появилась дочерняя контора, которая работает по вечерам и в выходные и праздничные дни. Что будешь делать? только создавать ещё одну аналогичную таблицу со всеми триггерами и прочими причиндалами, поскольку в твоей таблице первичный ключ - дата.
А если суррогатный ключ есть - то никаких проблем, пусть новый календарь живёт в этой-же таблице.

wadmanНе согласен: свойства элементов (день приема/рождения/увольнения), как и его исторические изменения (штрафы, отпуска, повышения/понижения, прогулы) не стоит пихать в календарь. И касательно моего случая количество календарей вырастет на несколько тысяч - тихий ужас

Я-же нигде не говорил, что каждому сотруднику свою таблицу календаря.
Связываем сотрудника отношением М-М с календарём. Например, для твоего случая делаем таблицу
Код: sql
1.
2.
3.
4.
5.
6.
CREATE TABLE CALENDAR_PERSONNEL (
    VAL            DATEITEM /* DATEITEM = DATE NOT NULL */,
    ID_PERSONNEL    INTEGER ,
    SHINE_DAY  BOOL DEFAULT 1,
    EBONY_DAY BOOL DEFAULT 0,
    HUE_OF_DAY VARCHAR(40));



где хранится корректировка календаря для конкретного сотрудника.
...
Рейтинг: 0 / 0
Производственный или рабочий календарь
    #38386281
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
zeon11Но! первичный ключ по дате лишает тебя манёвра на случай, если ты захочешь иметь не один, а два или три календаря. Поясняю, например, в твоём предприятии появилась дочерняя контора, которая работает по вечерам и в выходные и праздничные дни.
Как и я говорил ранее, меня волнует только производство - там нет нерабочих дней и нет необходимости считать рабочие часы и посещаемость ибо оно круглосуточное.

Понимаешь, наша дискуссия выглядит так, будто ты навязываешь мне свой вариант не учитывая, что мой календарь живет и выполняет возложенные на него требования на 100%. Попробуй не оспаривать мой вариант, а предложить свой и подчеркни отличия/плюсы.
...
Рейтинг: 0 / 0
Производственный или рабочий календарь
    #38386290
zeon11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadmanzeon11Угу, теоретизирую.....
Сколько у тебя строк в календаре на один год?

Когда как, в високосный 366, а обычно 365. Это на одно предприятие.
К календарю прикручена таблица расписания, (это то, что показано зелёным),
таблица расписаний генерится в процедуре на сервере на 1 день по шаблону (отдельная таблица) или по дню-образцу.
...
Рейтинг: 0 / 0
Производственный или рабочий календарь
    #38386312
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
zeon11Когда как, в високосный 366, а обычно 365. Это на одно предприятие.
К календарю прикручена таблица расписания, (это то, что показано зелёным),
Я-то думал, что ты все это 14792184 предлагаешь ввернуть в календарь. :) Так-то с предложением добавить поле вроде "Тип календаря/отдела" и включить его в ПК в целом согласен, если-бы мне нужно было учитывать работу еще и управления, которое как известно работает как у белых людей заведено.
...
Рейтинг: 0 / 0
Производственный или рабочий календарь
    #38386320
Фотография kdv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
такое впечатление, что гугл календарем никто не пользуется... Это я хотя бы про имитацию фич.
...
Рейтинг: 0 / 0
Производственный или рабочий календарь
    #38386325
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kdvтакое впечатление, что гугл календарем никто не пользуется...
Правильное впечатление. :)
...
Рейтинг: 0 / 0
Производственный или рабочий календарь
    #38386332
zeon11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadman,

У меня практически такой-же календарь, как у тебя, только названия полей другие, есть первичный суррогатный ключ, есть поле - FOREIGN KEY предприятия-владельца календаря,
нет индексов по "вычисляемым" полям.
На календарь навешана куча обвязок из таблиц М-М на разные случаи жизни.
...
Рейтинг: 0 / 0
Производственный или рабочий календарь
    #38386391
zeon11
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadman,

В своё время рассматривал вариант построения календаря на ARRAY,
матричные операции и прочие, как-бы плюшки, однако, реляционая модель всё-таки предпочтительнее оказалась.
...
Рейтинг: 0 / 0
Производственный или рабочий календарь
    #38386461
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
wadmanПроцедура по его заполнению:
В ней косячек оказался.
Ув. модераторы, поправьте стартовый пост, пожалуйста.
Код: sql
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.
94.
95.
96.
97.
98.
99.
SET TERM ^ ;

create or alter procedure FILL_CALENDAR (
    IFROM DATEITEM,
    ITO DATEITEM)
as
declare variable VAL DATEITEM;
declare variable D DATEITEM;
declare variable DOW CALENDARITEM;
declare variable DOM CALENDARITEM;
declare variable DOY CALENDARITEM;
declare variable WOM CALENDARITEM;
declare variable WOY CALENDARITEM;
declare variable MOY CALENDARITEM;
declare variable Q CALENDARITEM;
declare variable YO CALENDARITEM;
declare variable IWD BOOL;
declare variable IW BOOL;
declare variable IH BOOL;
declare variable IL BOOL;
begin
  val = :ifrom;
  while (:val < :ito) do begin
    il = 0;
    iwd = 0;
    iw = 0;
    ih = 0;
    d = :val - EXTRACT(WEEKDAY FROM :val-1) + 3;
    dow = extract(weekday from :val); -- день недели
    dom = extract(day from :val); -- день месяца
    doy = extract(yearday from :val); -- день года
    wom = EXTRACT(day FROM :val)/7 + 1; -- неделя месяца
    woy = (EXTRACT(YEARDAY FROM :d) - EXTRACT(WEEKDAY FROM :d-1) + 7) / 7e0; -- неделя года
    moy = extract(month from :val); -- месяц
    q = (EXTRACT(MONTH FROM :val)-1)/3+1; -- квартал
    yo = extract(year from :val); -- год
    if ((:dow = 6)or(:dow = 7)) then iw = 1; else iwd = 1; -- выходные или рабочие
    IF ( 2 = EXTRACT(MONTH FROM (:val - EXTRACT(YEARDAY FROM :val) + 59)) ) THEN IL = 1; -- високосный

    -- определим некоторые праздничные дни
    if ((:moy = 1)and(:dow = 1)) then begin
      ih = 1; -- новый год
      iwd = 0; -- не рабочий
      iw = 1; -- выходной
    end
    else if ((:moy = 1)and(:dow = 7)) then begin
      ih = 1; -- рождество христово
      iwd = 0; -- не рабочий
      iw = 1; -- выходной
    end
    else if ((:moy = 2)and(:dow = 23)) then begin
      ih = 1; -- день защитника отечества
      iwd = 0; -- не рабочий
      iw = 1; -- выходной
    end
    else if ((:moy = 3)and(:dow = 8)) then begin
      ih = 1; -- международный женский день
      iwd = 0; -- не рабочий
      iw = 1; -- выходной
    end
    else if ((:moy = 5)and(:dow = 1)) then begin
      ih = 1; -- праздник весны и труда
      iwd = 0; -- не рабочий
      iw = 1; -- выходной
    end
    else if ((:moy = 5)and(:dow = 9)) then begin
      ih = 1; -- день победы
      iwd = 0; -- не рабочий
      iw = 1; -- выходной
    end
    else if ((:moy = 6)and(:dow = 12)) then begin
      ih = 1; -- день россии
      iwd = 0; -- не рабочий
      iw = 1; -- выходной
    end
    else if ((:moy = 11)and(:dow = 4)) then begin
      ih = 1; -- день народного единства
      iwd = 0; -- не рабочий
      iw = 1; -- выходной
    end

    update or insert into calendar(val, day_of_week, day_of_month, day_of_year, week_of_month, week_of_year, month_of_year,
        quarter, year_of, is_leap, is_work_day, is_weekend, is_holiday)
      values (:val, :dow, :dom, :doy, :wom, :woy, :moy, :q, :yo, :il, :iwd, :iw, :ih)
      matching (val);
    val = :val + 1;
  end
end
^

SET TERM ; ^

/* Following GRANT statetements are generated automatically */

GRANT SELECT,INSERT,UPDATE ON CALENDAR TO PROCEDURE FILL_CALENDAR;

/* Existing privileges on this procedure */

GRANT EXECUTE ON PROCEDURE FILL_CALENDAR TO SYSDBA;



В старой версии current_date затесался вместо val.
...
Рейтинг: 0 / 0
Производственный или рабочий календарь
    #38386692
Ivan_Pisarevsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Исправил.
...
Рейтинг: 0 / 0
Производственный или рабочий календарь
    #38387253
__Avenger__
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У нас в организации проще, нам этот справочник рассылают. Причем в двух вариантах. Первый - без учета регионов, второй - по регионам .
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Производственный или рабочий календарь
    #38981522
iGuest1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
__Avenger__,

для 2015 г. неправильно заполнился
...
Рейтинг: 0 / 0
Производственный или рабочий календарь
    #38981524
Поручик ·· Ржевский
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
партизан из лесу вышел, мля!
...
Рейтинг: 0 / 0
Производственный или рабочий календарь
    #38981540
iGuest1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Поручик ·· Ржевский,
Код: sql
1.
2.
    d = :val - EXTRACT(WEEKDAY FROM :val-1) + 3;
    if ((:dow = 6)or(:dow = 7)) then iw = 1; else iwd = 1; -- выходные или рабочие


косяк где-то тут)
...
Рейтинг: 0 / 0
Производственный или рабочий календарь
    #38981543
Поручик ·· Ржевский
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
косяк скурили 2 года назад.
ты пришел с опозданием.
...
Рейтинг: 0 / 0
Производственный или рабочий календарь
    #38981549
iGuest1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Поручик ·· Ржевский,

пусть и скурили, но может кому-то пригодится

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
  while (:val < :ito) do begin
    il = 0;
    iwd = 0;
    iw = 0;
    ih = 0;
    d = :val - EXTRACT(WEEKDAY FROM :val-1) + 3;
    dow = extract(weekday from :val); -- день недели
    if (:dow=0) then
    begin
      dow = 7;
    end
    dom = extract(day from :val); -- день месяца
    doy = extract(yearday from :val) + 1; -- день года
    wom = EXTRACT(day FROM :val)/7 + 1; -- неделя месяца
    woy = (EXTRACT(YEARDAY FROM :d) - EXTRACT(WEEKDAY FROM :d-1) + 7) / 7e0; -- неделя года
    moy = extract(month from :val); -- месяц
    q = (EXTRACT(MONTH FROM :val)-1)/3+1; -- квартал
    yo = extract(year from :val); -- год
    if ((:dow = 6)or(:dow = 7)) then iw = 1; else iwd = 1; -- выходные или рабочие
    IF ( 2 = EXTRACT(MONTH FROM (:val - EXTRACT(YEARDAY FROM :val) + 59)) ) THEN IL = 1; -- високосный
...
Рейтинг: 0 / 0
25 сообщений из 25, страница 1 из 1
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Производственный или рабочий календарь
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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