Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Таблица-календарь праздничных дней  [new]
Guf
Member

Откуда: Новосибирск
Сообщений: 641
Коллеги, есть вопрос по организации хранения рабочих / выходных / праздничных дней для разных стран / контрагентов.
Если модераторы считают, что вопрос больше относится к проектированию, пожалуйста, перенесите тему.

Принято правило, что пн-пт являются рабочими днями, а сб и вс - выходными. Все исключения из этого правила раз в год заносятся в таблицу исключений
+ для 2018 года

CREATE TABLE [dbo].[calendar](
    [date]      DATE    NOT NULL
  , [include]   INT     NOT NULL
);
INSERT INTO [dbo].[calendar]([date], [include])
VALUES  ('20181231', 0)
      , ('20181229', 1)
      , ('20181105', 0)
      , ('20180612', 0)
      , ('20180611', 0)
      , ('20180609', 1)
      , ('20180509', 0)
      , ('20180502', 0)
      , ('20180501', 0)
      , ('20180430', 0)
      , ('20180428', 1)
      , ('20180309', 0)
      , ('20180308', 0)
      , ('20180223', 0)
      , ('20180108', 0)
      , ('20180105', 0)
      , ('20180104', 0)
      , ('20180103', 0)
      , ('20180102', 0)
      , ('20180101', 0)
;

include = 0 - не рабочий день
include = 1 - рабочий день


Теперь требуется обрабатывать графики работы для разных организаций. Например некоторые организации вполне могут работать 3, 4, 5 января, а у некоторых наоборот могут быт свои не рабочие дни (организации из других стран).

Пока в голове только дополнительная таблица, в которой будут храниться: дата, идентификатор организации, и признак рабочий день или нет. Т.о. нужно будет проверять для конкретной организации, в порядке убывания приоритета, наличие записи в этой дополнительной таблице, потом в основной, потом стандартное правило.

Поделитесь опытом / идеями, как лучше всего решить данную задачу.

Microsoft SQL Server 2008 R2 (SP3) - 10.50.6000.34 (X64)   Aug 19 2014 12:21:34   Copyright (c) Microsoft Corporation  Standard Edition (64-bit)
on Windows NT 6.3 <X64> (Build 9600: )
22 май 18, 11:49    [21428266]     Ответить | Цитировать Сообщить модератору
 Re: Таблица-календарь праздничных дней  [new]
Alex1975
Member

Откуда:
Сообщений: 219
Guf,

Делал аналогичную задачу.
В отдельную таблицу занес по контрагентам все нерабочие дни, включая сб и вс, т.к. бывает что и выходные рабочие по всяким праздникам.
Потом процедуру нарисовал отдачи календаря по каждому контрагенту.
CREATE TABLE [dbo].[market_no_work_date](
[mkt_id] [dbo].[refer] NOT NULL,
[no_work_date] [date] NOT NULL)


Create proc [dbo].[get_market_work_day]
(
@mkt_id refer
,@DateFrom date=null
,@DateTo date=null
)
as
Begin
Select @DateFrom=isnull(@DateFrom,getdate())
Select @DateTo=isnull(@DateTo,getdate())
;WITH
L0 AS (SELECT 0 AS c UNION ALL SELECT 0),
L1 AS (SELECT 0 AS c FROM L0 AS A CROSS JOIN L0 AS B),
L2 AS (SELECT 0 AS c FROM L1 AS A CROSS JOIN L1 AS B),
L3 AS (SELECT 0 AS c FROM L2 AS A CROSS JOIN L2 AS B),
L4 AS (SELECT 0 AS c FROM L3 AS A CROSS JOIN L3 AS B),
Nums AS (SELECT ROW_NUMBER() OVER(ORDER BY (SELECT 0)) AS n FROM L4)
,dates as (SELECT cast(dateadd(dd,n-1,@DateFrom) as date) d FROM Nums)
,dates_row as (Select ROW_NUMBER() OVER(PARTITION BY mnwd.no_work_date ORDER BY mnwd.no_work_date) AS RowN,d.d,mnwd.no_work_date From dates d
left outer join market_no_work_date mnwd on d.d=mnwd.no_work_date and mnwd.mkt_id=@mkt_id)
Select d,case when no_work_date is null then 1 else 0 end as work_day from dates_row
Where d<=@DateTo
End
22 май 18, 12:13    [21428363]     Ответить | Цитировать Сообщить модератору
 Re: Таблица-календарь праздничных дней  [new]
iiyama
Member

Откуда:
Сообщений: 642
Guf,
1. Вы удивитесь, но во многих странах выходные дни это пятница и суббота
2. Для этого придумали производственные календари
3. И да, на предприятии их может быть много.
23 май 18, 10:58    [21431388]     Ответить | Цитировать Сообщить модератору
 Re: Таблица-календарь праздничных дней  [new]
Guf
Member

Откуда: Новосибирск
Сообщений: 641
iiyama,

1. Удивился.
2. Именно его я и хочу сделать. (т.е. уже делаю по описанному в стартовом посте способу)
3. Именно в том и заключается вопрос, как люди делают несколько производственных календарей?
24 май 18, 06:48    [21434636]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить