在sql server中创建日历表

ckx4rj1h  于 2021-07-24  发布在  Java
关注(0)|答案(1)|浏览(544)

我正在使用microsoft sql server 2012并创建下表:

  1. Clinic_code Clinic_name D D_days_passed
  2. ------------------------------------------------------
  3. A123 NAME1 2018-12-01 1
  4. A124 NAME2 2018-12-01 1
  5. A125 NAME3 2018-12-01 1
  6. [...]
  7. A123 NAME1 2018-12-02 2
  8. A124 NAME2 2018-12-02 2
  9. A125 NAME3 2018-12-02 2
  10. [...]
  11. A123 NAME1 2018-12-03 3
  12. A124 NAME2 2018-12-03 3
  13. A125 NAME3 2018-12-03 3

我在这里改编了@johncappelletti的代码,但是我很难包含'd\u days\u passed'列,它基本上统计自开始日期以来的天数:

  1. DECLARE @fromdate date = '2018-12-01'
  2. SELECT #MyTable.*, B.D
  3. FROM #MyTable
  4. CROSS APPLY
  5. (SELECT TOP (DATEDIFF(DAY, @fromdate, DATEADD(Month, 9, @fromdate)) + 1)
  6. D = CONVERT(date, DATEADD(DAY, -1 + ROW_NUMBER() OVER (ORDER BY (SELECT NULL)), @fromdate))
  7. FROM master..spt_values n1) B

如果你有时间,
问题:如何调整代码,而不是将每个诊所从一个日期到另一个日期的每一天都包括在内,我想为每个诊所引入相同的周周期,例如,从周六到周日:

  1. Clinic_code Clinic_name D_start D_end Weeks_passed
  2. -------------------------------------------------------------------------
  3. A123 NAME1 2018-12-02 2018-12-08 1
  4. A124 NAME2 2018-12-02 2018-12-08 1
  5. A125 NAME3 2018-12-02 2018-12-08 1
  6. [...]
  7. A123 NAME1 2018-12-09 2018-12-15 2
  8. A124 NAME2 2018-12-09 2018-12-15 2
  9. A125 NAME3 2018-12-09 2018-12-15 2
  10. [...]
  11. A123 NAME1 2018-12-16 2018-12-22 3
  12. A124 NAME2 2018-12-16 2018-12-22 3
  13. A125 NAME3 2018-12-16 2018-12-22 3
p1tboqfb

p1tboqfb1#

您只需使用窗口函数来获取最早的日期,然后 datediff() :

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

这也应该持续几个星期。

相关问题