繁体   English   中英

SQL查询未返回预期的日期时间范围

[英]SQL query not returning expected date time range

我正在研究一个查询,希望该查询可用于在特定日期的特定时间范围内对数据库进行查询。 如果查询一整天的数据,我将返回正确的数据。 每小时可用数据一行(0-23)。

WHERE Documents.CreationTime BETWEEN '2014-10-01 00:00:00.000' AND '2014-10-01 23:59:59.999'

如果我尝试查询一天中的某段时间,则结果不正常。

WHERE Documents.CreationTime BETWEEN '2014-10-01 00:00:00.000' AND '2014-10-01 06:00:00.000'

零件日查询返回:(请注意小时数从0跳到19)

Hours   Faxes   Good Page Count
    0         3       4
    19       15      58
    20        4       9
    21        8      42
    22        2       4
    23        4      12

这是我为尝试解决此问题而创建的简化查询。

SELECT DATEPART(hour, DATEADD(HH, - DATEDIFF(Hour, GETDATE(), GETUTCDATE()), Documents.CreationTime)) AS Hours
    ,COUNT(*) AS Faxes
    ,SUM(goodpagecount) AS [Good Page Count]
FROM Documents
JOIN Users
    ON Documents.OwnerID = Users.handle
JOIN Groups
    ON Users.GroupID = Groups.handle
JOIN History
    ON History.OWNER = Documents.handle
JOIN HistoryTRX
    ON History.handle = HistoryTRX.handle
WHERE Documents.CreationTime BETWEEN '2014-10-01 00:00:00.000'
        AND '2014-10-01 06:00:00.000'
GROUP BY DATEPART(hour, DATEADD(HH, - DATEDIFF(Hour, GETDATE(), GETUTCDATE()), Documents.CreationTime))
ORDER BY DATEPART(hour, DATEADD(HH, - DATEDIFF(Hour, GETDATE(), GETUTCDATE()), Documents.CreationTime))

关于我的缺失或改进有什么建议吗?

编辑-更多详细信息“ Documents.CreationTime”位于UTC中。 我希望“小时”列与当地时间相对应。 在这种情况下,从此条目开始,UTC -5。

如何在where子句中使用DATEADD函数:

WHERE Documents.CreationTime >= '20141001' AND Documents.CreationTime <= DATEADD(HOUR,6,'20141001')

关于Lamak由Aaron Bertrand撰写的评论的有趣博客:

根据针对我的问题提供的建议,我提出了以下新查询:

SELECT  DATEPART(hour, DATEADD(HH,-DATEDIFF(Hour,GETDATE(),GETUTCDATE()),Documents.CreationTime)) AS Hours ,COUNT(*) AS Faxes,SUM(goodpagecount) AS [Good Page Count]
FROM Documents
JOIN Users ON Documents.OwnerID=Users.handle
JOIN Groups ON Users.GroupID=Groups.handle
JOIN History ON History.Owner=Documents.handle
JOIN HistoryTRX ON History.handle=HistoryTRX.handle
WHERE DATEADD(HH,-DATEDIFF(Hour,GETDATE(),GETUTCDATE()),Documents.CreationTime) >= '2014-10-01 00:00:00.000' and DATEADD(HH,-DATEDIFF(Hour,GETDATE(),GETUTCDATE()),Documents.CreationTime) <= '2014-10-03 08:00:00.000'
GROUP BY  DATEPART(hour, DATEADD(HH,-DATEDIFF(Hour,GETDATE(),GETUTCDATE()),Documents.CreationTime))
ORDER BY  DATEPART(hour, DATEADD(HH,-DATEDIFF(Hour,GETDATE(),GETUTCDATE()),Documents.CreationTime))

我的更改是通过添加我的UTC补偿来更改“ WHERE”语句。 现在,“ WHERE”与“ SELECT”匹配。

之前:

WHERE Documents.CreationTime >= '2014-10-01 00:00:00.000' and Documents.CreationTime <= '2014-10-03 08:00:00.000'

后:

WHERE DATEADD(HH,-DATEDIFF(Hour,GETDATE(),GETUTCDATE()),Documents.CreationTime) >= '2014-10-01 00:00:00.000' and DATEADD(HH,-DATEDIFF(Hour,GETDATE(),GETUTCDATE()),Documents.CreationTime) <= '2014-10-03 08:00:00.000'

还删除了BETWEEN关键字,因为它对结果的准确性可能不如我想要的那样。

结果现在看起来像:

Hours   Faxes   Good Page Count
      0       3      4
      1       5      9
      3       9     50
      4       8     16
      5      14     40

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM