Создать календарную таблицу на SQL сервере - PullRequest
0 голосов
/ 10 июля 2020

Я использую Microsoft SQL Server 2012 и создаю следующую таблицу:

Clinic_code Clinic_name        D        D_days_passed
------------------------------------------------------
   A123       NAME1       2018-12-01         1      
   A124       NAME2       2018-12-01         1      
   A125       NAME3       2018-12-01         1      
   [...]
   A123       NAME1       2018-12-02         2      
   A124       NAME2       2018-12-02         2      
   A125       NAME3       2018-12-02         2      
   [...]
   A123       NAME1       2018-12-03         3      
   A124       NAME2       2018-12-03         3     
   A125       NAME3       2018-12-03         3   

Я адаптировал здесь код из @JohnCappelletti, но мне не удается включить столбец 'D_days_passed' который, по сути, считает количество дней с даты начала:

DECLARE @fromdate date = '2018-12-01'

SELECT #MyTable.*, B.D
FROM #MyTable
CROSS APPLY
    (SELECT TOP (DATEDIFF(DAY, @fromdate, DATEADD(Month, 9, @fromdate)) + 1) 
         D = CONVERT(date, DATEADD(DAY, -1 + ROW_NUMBER() OVER (ORDER BY (SELECT NULL)), @fromdate))
     FROM master..spt_values n1) B

Если у вас есть время,

Вопрос : как можно изменить код вместо включения каждый день с одной даты на другую по клини c, я хотел ввести один и тот же период недели по клини c, например, с субботы по воскресенье:

Clinic_code Clinic_name        D_start        D_end         Weeks_passed
-------------------------------------------------------------------------
   A123       NAME1           2018-12-02   2018-12-08             1      
   A124       NAME2           2018-12-02   2018-12-08             1      
   A125       NAME3           2018-12-02   2018-12-08             1      
   [...]
   A123       NAME1           2018-12-09   2018-12-15             2 
   A124       NAME2           2018-12-09   2018-12-15             2 
   A125       NAME3           2018-12-09   2018-12-15             2 
   [...]
   A123       NAME1           2018-12-16   2018-12-22             3
   A124       NAME2           2018-12-16   2018-12-22             3
   A125       NAME3           2018-12-16   2018-12-22             3

1 Ответ

0 голосов
/ 10 июля 2020

Вы можете просто использовать оконные функции, чтобы получить самую раннюю дату, а затем datediff():

Select t.*, B.D,
       datediff(day, min(date) over (), date) + 1 as days_passed
From  #MyTable t Cross Apply
      (Select Top (DateDiff(DAY,@fromdate,DateAdd(Month,9,@fromdate))+1) 
                  D=convert(date,DateAdd(DAY,-1+Row_Number() Over (Order By (Select Null)),@fromdate))
       From  master..spt_values n1
      ) B;

Это также должно работать в течение нескольких недель.

...