SQL DATEADD返回不正确的结果

时间:2013-05-06 17:12:25

标签: sql sql-server dateadd

我目前正在为Visual Studio 2012编写查询,并使用SQL Server 2008 R2在Microsoft SQL Server Management Studio中对其进行测试。

目前,我已经阅读了MSDN关于日期时间和DATEADD的文章,但似乎我的语法是正确的。我还阅读了Google上的一些内容以及How to select last one week data from today's dateMySQL: DATE_ADD以及更多Stack Overflow文章。

我正在运行的查询非常简单,只需:

SELECT [DateTime] AS 'Time'
      ,[RawStatus] AS 'Data'
  FROM [ADatabase].[dbo].[SomeTable]
  WHERE CustomPollerAssignmentID = '6570267A-22E1-4556-B344-EB27D9831419' --Latency Poller
    AND RowID = 000042 --Some Modem Number
    AND DATEADD(HOUR, -1, CURRENT_TIMESTAMP) <= DateTime 
  ORDER BY DateTime DESC

我期望这样做是为了返回最后一小时的数据(在这种情况下是网络延迟)。相反,它返回了最后三小时三十分钟。当运行带有DATEADD语句的代码被注释掉时,它运行得很好,并返回过去一两天的所有内容,这是该表存储延迟数据的最长时间。

现在,上面的奇怪代码是根据以下内容建模的,我知道有效:

SELECT  NMSDS.[SnapshotTimestamp] AS 'Time'
      ,[LatencyValue] AS 'Latency'
  FROM [ADifferentDatabase].[dbo].[AnotherTable] Late
  INNER JOIN ADifferentDatabase.dbo.YetAnotherTable NMSDS ON NMS_Id = 1 
    AND NMSDS.SnapshotID = Late.SnapshotID
  WHERE DATEADD(HOUR, -6, CURRENT_TIMESTAMP) <= NMSDS.SnapshotTimestamp 
    AND InrouteGroupId = @IRID 
    AND NetworkId = @NTID
  ORDER BY [Late].SnapshotID ASC

我的问题是:

  1. 我缺少什么?
  2. 我的查询格式错了吗?第二个是为什么它会返回3.5小时而不是一小时,因为第二个查询实际上有效并且返回正确的东西?

2 个答案:

答案 0 :(得分:0)

你究竟想要什么?你想要最后一个时钟的数据吗? (例如,如果它是10点37分,您希望所有数据在9:00到10:00之间)

或者您想要过去一小时的数据? (如果它是10:37:12你想要9:37:13和10:37:12之间的所有数据)

首先,将where子句更改为

...And NMSDS.SnapshotTimestamp >= 
            DateAdd(hour, datediff(hour, 0, Current_Timestamp)-1, 0), 
   And NMSDS.SnapshotTimestamp <  
            DateAdd(hour, datediff(hour, 0, Current_Timestamp), 0)

对于第二个,它更容易......

 ... And NMSDS.SnapshotTimestamp > Current_Timestamp - 1/24

但我承认我对第二个查询中的值6感到困惑...为什么是6,如果您正在尝试上一个 单个的数据小时??

答案 1 :(得分:0)

我不得不说你缺少时区数据。 根据您的查询,没有数据服务器所在的时区,或者他们将数据插入的时区。