【问题标题】:Create calendar table in SQL Server在 SQL Server 中创建日历表
【发布时间】:2020-10-31 09:28:19
【问题描述】:

我使用的是 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”列,该列基本上计算自 Start_date 以来的天数:

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

如果你有时间,

问题:如何将代码调整为,而不是包括每个诊所从一个日期到另一个日期的每一天,我想从星期六开始为每个诊所引入相同的一周时间段,例如这个-周日:

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

【问题讨论】:

    标签: sql sql-server calendar time-series


    【解决方案1】:

    您可以只使用窗口函数来获取最早的日期,然后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;
    

    这也应该可以工作数周。

    【讨论】:

    • 谢谢戈登 - 它正在工作。我该怎么做问题 2?我不知道如何调整代码以生成这 2 列 D_start 和 D_end 而不是 D ?
    • @DanielaRodrigues 。 . .你应该在一个问题中只问一个问题。但不要在子查询中使用+ row_number,而是尝试+ 7 * row_number
    猜你喜欢
    • 2021-10-03
    • 2020-10-31
    • 1970-01-01
    • 1970-01-01
    • 2013-10-31
    • 2020-08-01
    • 1970-01-01
    • 2017-12-18
    • 2018-09-06
    相关资源
    最近更新 更多