每周数据Sql查询周四至周三

时间:2014-05-10 13:33:26

标签: sql sql-server

通过在链接下面使用我试图进行每周查询。我的周从星期四开始,持续到星期三,我正确地改变但是(Field1)的总和未正确出现。我做错了什么?

Query for weekly report

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中的值不同

1 个答案:

答案 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的第二个参数。