SQL查询的意外输出

时间:2017-10-30 03:30:12

标签: sql sql-server tsql

表格如下

column1 column2   timestamp
-----------------------------------------
 1      1         2017-09-05 15:09:57.811

执行此查询

SELECT 
    SUM(column1) column1, SUM(column2) column2, roundDate, 
    COUNT(*) recordCount 
FROM 
    (SELECT 
         column1, column2, 
         DATEADD(second, FLOOR(((DATEDIFF(second, '20000101', DATEADD(MINUTE, 480, timestamp)) / 2592000) * 2592000)), '20000101') AS roundDate 
     FROM 
         tablename 
     WHERE 
         (column1 > 0 OR column2 > 0) 
         AND DATEADD(MINUTE, 480, timestamp) BETWEEN '2017-09-01 07:30:00' 
                                                 AND '2017-09-30 07:30:00'  
         AND CAST(DATEADD(MINUTE, 480, timestamp) AS time) BETWEEN '07:30' AND '19:30') t 
GROUP BY 
    roundDate 
ORDER BY 
    roundDate

注意:2592000是区间值,可根据用户选择(1分钟,3分钟,10分钟,每周,每月和每季度)进行更改

当前结果

column1   column2  roundDate                  recordCount 
----------------------------------------------------------
45        627      2017-08-29 00:00:00.000    212
480       334      2017-09-28 00:00:00.000    830

正如您所看到的,结果中的roundDate错误,因为它回到了8月并且从9月开始检测到某些天。它应该遵循where子句条件BETWEEN '2017-09-01 07:30:00' AND'2017-09-30 07:30:00'并仅返回一个记录。

预期结果

column1   column2  roundDate                  recordCount 
-----------------------------------------------------------
525       961      2017-09-29 00:00:00.000    1042

此查询有什么问题?

1 个答案:

答案 0 :(得分:0)

如果您想在日历月过滤,则应该这样做。您的查询目前正在做的是将时间分为自2000-01-01以来的30天切片。我希望2017-08-29是其中一个片段的开始。