通过在链接下面使用我试图进行每周查询。我的周从星期四开始,持续到星期三,我正确地改变但是(Field1)的总和未正确出现。我做错了什么?
SELECT
DATEADD(WEEK, DATEDIFF(WEEK, '19000104', START_DATETIME), '19000104') AS EveryThrusday,
DATEADD(WEEK, DATEDIFF(WEEK, '19000104', START_DATETIME)+1, '19000104') - 1 AS EveryWednesday,
SUM(Field1)
FROM
Table1
GROUP BY
DATEADD(WEEK, DATEDIFF(WEEK, '19000104', START_DATETIME), '19000104'),
DATEADD(WEEK, DATEDIFF(WEEK, '19000104', START_DATETIME)+1, '19000104')-1
ORDER BY
DATEADD(WEEK, DATEDIFF(WEEK, '19000104', START_DATETIME), '19000104'),
DATEADD(WEEK, DATEDIFF(WEEK, '19000104', START_DATETIME)+1, '19000104')-1
Table 1
:
Date field1
1-May-14 102948.66
2-May-14 102927.21
3-May-14 102925.89
4-May-14 102427.55
5-May-14 101551.95
6-May-14 102952.12
7-May-14 102947.53
总计= 718680.93
Table 2
:
Start date End date field1
1-May-14 7-May-14 719793.72
在第一张表中,我将从5月1日星期四到5月7日每天检索数据。那些天的总和是718680.93
但是,如果我运行每周查询,请参阅field1表2中的值不同
答案 0 :(得分:0)
您可以通过查看范围中每个日期DATEADD(WEEK, DATEDIFF(WEEK, '19000104', START_DATETIME), '19000104')
的结果,轻松了解为什么总和与正确值不同。以下查询:
SELECT
START_DATETIME,
Thursday = DATEADD(WEEK, DATEDIFF(WEEK, '19000104', START_DATETIME), '19000104')
FROM dbo.Table1;
会给你这样的结果:
START_DATETIME Thursday
-------------- ----------
2014-05-01 2014-05-01
2014-05-02 2014-05-01
2014-05-03 2014-05-01
2014-05-04 2014-05-08
2014-05-05 2014-05-08
2014-05-06 2014-05-08
2014-05-07 2014-05-08
如您所见,您的表达式不会为周四开始的同一周内的所有日期返回相同的结果。因此,您的查询会对不同的日期进行分组,这反过来也会导致您获得错误的结果。
请注意,无论DATEFIRST
设置,表达式都会返回相同的不一致日期,因为DATEDIFF
does not respect that setting并始终计算结果,就好像{{ 1}}设置为7。
要解决此问题,您可以将DATEFIRST
替换为DATEDIFF(WEEK)
:
DATEDIFF(DAY) / 7
由于两个操作数都是整数,因此SQL Server将执行整数除法,因此,它的结果将是一个整数(在这种情况下是正确的)周数。
或者,您可以通过从日期中减去星期数来计算一周的开头:
DATEADD(WEEK, DATEDIFF(DAY, '19000104', START_DATETIME) / 7, '19000104')
同样,本周末将使用DATEADD(DAY, 1 - DATEPART(WEEKDAY, START_DATETIME), START_DATETIME)
。以上假设7 - DATEPART(...)
设置为4(即星期四)。如果您的环境不同,则需要相应地调整DATEFIRST
的第二个参数。