DATEPART的意外行为

时间:2014-12-25 12:30:22

标签: sql sql-server tsql sql-server-2012

列出日期和星期日期的脚本:

DECLARE @initDate DATE = '2014-01-01';
DECLARE @endDate DATE = '2014-12-31';

WITH dates (date, week)
     AS (SELECT @initDate               date,
                Datepart(ww, @initDate) week
         UNION ALL
         SELECT Dateadd(ww, 1, t.date),
                Datepart(ww, t.date)
         FROM   dates t
         WHERE  t.date < @endDate)
SELECT dates.date,
       dates.week
FROM   dates 

前三行是:

date:       week number
----------  -----------
2014-01-01  1
2014-01-08  1
2014-01-15  2
.....       ..
.....       ..

我猜第二排应该是2,第一排应该是3,不是吗? 是DATEPART中的某种错误吗?即使某些事情取决于一年中的第一天,第一行日期也不同于一周内的第二行日期与任何设置。

你能澄清一下吗?

1 个答案:

答案 0 :(得分:4)

这是因为Recursive CTE不是因为Datepart

在CTE的递归部分week仍然保持前一周而不是在递归部分生成的新date

尝试更改您的查询。

DECLARE @initDate DATE = '2014-01-01';
DECLARE @endDate DATE = '2014-12-31';

WITH dates (date, week)
     AS (SELECT @initDate               date,
                Datepart(ww, @initDate) week
         UNION ALL
         SELECT Dateadd(ww, 1, t.date),
                Datepart(ww, Dateadd(ww, 1, t.date))
         FROM   dates t
         WHERE  t.date < @endDate)
SELECT dates.date,
       dates.week
FROM   dates