【问题标题】:Creating calendar table per week using SQL Server使用 SQL Server 每周创建日历表
【发布时间】:2020-10-31 13:00:54
【问题描述】:

我正在使用 Microsoft SQL Server 2012,我想创建下表(从 2018-12-02 到 2019-08-31):

Clinic_code Clinic_name        Day_start        Day_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

我正在使用以下代码:

DECLARE @fromstartdate date = '2018-12-02'
DECLARE @fromenddate date = '2018-12-08'

SELECT 
    #MyTable.*, B.Day_start, C.Day_end, 
    DATEDIFF(day, MIN(B.Day_start) OVER (), 
    B.Day_start) + 1 AS Weeks_passed
FROM  
    #MyTable
CROSS APPLY 
    (SELECT TOP (DATEDIFF(DAY, @fromstartdate, DATEADD(Month, 9, @fromstartdate))) 
         Day_start = CONVERT(date, DATEADD(DAY, -1 + 7 * ROW_NUMBER() OVER (ORDER BY (SELECT NULL)), @fromstartdate))
     FROM master..spt_values n1) B
CROSS APPLY
    (SELECT TOP (DATEDIFF(DAY, @fromenddate, DATEADD(Month, 9, @fromenddate))) 
         Day_end = CONVERT(date, DATEADD(DAY, -1 + 7 * ROW_NUMBER() OVER (ORDER BY (SELECT NULL)), @fromenddate))
     FROM master..spt_values n1) C

但是我没有收到第一个 @fromstartdate@fromenddate 并且它已经超过了 2019 年 8 月 31 日。你能告诉我我做错了什么吗?

【问题讨论】:

  • 2019 年 8 月之后的时间是由于“+7*” 不清楚预期的结果应该是什么。
  • 感谢@JohnCappelletti。我对代码感到困惑。我想从周日到周六(从 2018-12-02 到 2019-08-31)有几个星期,例如,第 1 周(2018-12-02 2018-12-08),第 2 周(2018-12-09 2018-12-15)等针对不同的诊所(A123、A124 等)重复。类似于另一个问题,我认为我的想法是为不同的电影重复相同的日子。

标签: sql sql-server time-series


【解决方案1】:

我会选择创建递归公用表表达式并将其加入您的表的方法。使用 CTE,您可以创建日期列表并通过在每周的每个开始添加 6 天来定义日期范围。经过的周数是按增量计算的。

DECLARE @fromstartdate date = '2018-12-02'
DECLARE @fromenddate date = '2019-08-31'

;WITH cteDateList AS
(
    SELECT @fromstartdate AS Day_start, DATEADD(D, 6, @fromstartdate) AS Day_end, 1 AS Weeks_passed
    UNION ALL
    SELECT DATEADD(D, 7, Day_start), DATEADD(D, 6, Day_end), Weeks_passed + 1 FROM cteDateList
    WHERE DATEADD(D, 7, Day_start) <= @fromenddate
)


SELECT mt.clinic_code, mt.clinic_name, dl.* FROM MyTable mt
CROSS APPLY (SELECT * FROM cteDateList) dl
ORDER BY dl.Day_start, mt.clinic_code;

【讨论】:

  • 谢谢@LukasSchmidt。我试过你的代码,但现在只给了我第一周的时间——你认为它会发生什么?
  • 检查您的参数。如果您仍然使用上面示例中的“2018-12-02”和“2018-12-08”,那么只看到第一周是正确的
  • 谢谢@LukasSchmidt。对不起,我是 SQL 新手。如何检查我的参数?我期待看到 cteDateList 以增量方式更新新的 fromstartdate 和 fromenddate 但它似乎没有这样做。不是这个主意吗?
  • 查看您在查询顶部分配给 fromstartdate 和 fromenddate 的值。还是“2018-12-02”和“2018-12-08”吗?如果是这样,那么两者之间只有一周的时间。您应该将 fromenddate 更改为您在问题中提到的日期(2019-08-31)。
  • 查看代码的时间过长。抱歉 - 我将参数设置为错误的日期。它正在工作 - 感谢您的帮助@Luke
猜你喜欢
  • 2020-10-31
  • 2019-09-01
  • 1970-01-01
  • 2021-10-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-25
相关资源
最近更新 更多