使用sql server创建每周日历表

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

我正在使用microsoft sql server 2012,希望创建下表(从2018-12-02到2019-08-31):

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

我正在使用以下代码:

  1. DECLARE @fromstartdate date = '2018-12-02'
  2. DECLARE @fromenddate date = '2018-12-08'
  3. SELECT
  4. #MyTable.*, B.Day_start, C.Day_end,
  5. DATEDIFF(day, MIN(B.Day_start) OVER (),
  6. B.Day_start) + 1 AS Weeks_passed
  7. FROM
  8. #MyTable
  9. CROSS APPLY
  10. (SELECT TOP (DATEDIFF(DAY, @fromstartdate, DATEADD(Month, 9, @fromstartdate)))
  11. Day_start = CONVERT(date, DATEADD(DAY, -1 + 7 * ROW_NUMBER() OVER (ORDER BY (SELECT NULL)), @fromstartdate))
  12. FROM master..spt_values n1) B
  13. CROSS APPLY
  14. (SELECT TOP (DATEDIFF(DAY, @fromenddate, DATEADD(Month, 9, @fromenddate)))
  15. Day_end = CONVERT(date, DATEADD(DAY, -1 + 7 * ROW_NUMBER() OVER (ORDER BY (SELECT NULL)), @fromenddate))
  16. FROM master..spt_values n1) C

但我不是第一个 @fromstartdate 以及 @fromenddate 它将远远超过2019年8月31日。你能告诉我我做错了什么吗?

rwqw0loc

rwqw0loc1#

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

  1. DECLARE @fromstartdate date = '2018-12-02'
  2. DECLARE @fromenddate date = '2019-08-31'
  3. ;WITH cteDateList AS
  4. (
  5. SELECT @fromstartdate AS Day_start, DATEADD(D, 6, @fromstartdate) AS Day_end, 1 AS Weeks_passed
  6. UNION ALL
  7. SELECT DATEADD(D, 7, Day_start), DATEADD(D, 6, Day_end), Weeks_passed + 1 FROM cteDateList
  8. WHERE DATEADD(D, 7, Day_start) <= @fromenddate
  9. )
  10. SELECT mt.clinic_code, mt.clinic_name, dl.* FROM MyTable mt
  11. CROSS APPLY (SELECT * FROM cteDateList) dl
  12. ORDER BY dl.Day_start, mt.clinic_code;

相关问题