SQL Server中奇怪的时差

时间:2015-08-10 05:58:24

标签: c# sql sql-server sql-server-2012

我有一个如下所述的SQL表,其中包含每30分钟执行1条记录以及其他一些列 -

ID | dt
1  | 2015-08-08 23:30:00.000
2  | 2015-08-08 23:00:00.000
3  | 2015-08-08 22:30:00.000
4  | 2015-08-08 22:00:00.000
5  | 2015-08-08 21:30:00.000

我运行以下查询以从昨天从SQL Server获取所有记录。

select ID, dt from tbl1
WHERE  DATEADD(dd, DATEDIFF(dd, 0, dt), 0) >= DATEADD(dd, DATEDIFF(dd, 0, @StartDate), 0) 
and DATEADD(dd, DATEDIFF(dd, 0, dt), 0) <= DATEADD(dd, DATEDIFF(dd, 0, @EndDate), 0)

当我将参数发送为StartDate = '2015-08-08 12:00:00' and EndDate='2015-08-08 06:30:00'时,查询运行正常并返回结果,但在StartDate = '2015-08-08 12:00:00' and EndDate='2015-08-08 06:00:00'或当EndDate特别小于'2015-08-08 06:30时,它不返回任何记录: 00' 。我在服务器上运行SELECT GETDATE(),它返回服务器时钟显示的相同时间。

修改

代码通过每30分钟运行一次的Windows服务执行。假设应用程序在早上1:00运行,从上次日期检索记录并执行操作,但如上所述,记录仅在上午6:30之后返回,目前我仍然坚持在上午7点运行服务而不是凌晨1点。

当我将服务设置为从本地计算机运行时,它在凌晨1点正常运行并返回结果,但在生产服务器上,它不会在早上6:30之前返回任何记录。

我没有线索为什么会发生这种差异。任何帮助表示赞赏。

如果您需要进一步澄清,我会在这里回答。

1 个答案:

答案 0 :(得分:0)

您最初询问为什么在@StartDate出现时没有收到任何记录?2015-08-08 12:00:00&#39; @EndDate是&#39; 2015-08-08 06:30:00&#39;。请注意,在这种情况下,@StartDate位于@EndDate之后,因此您永远不会使dt值大于@StartDate且小于@EndDate

话虽这么说,你显然想要使用@StartDate@EndDate参数的FLOOR(即忽略时间部分)而不是原始使用它们,所以你能做什么:

  • 仅关注@StartDate@EndDate参数
  • 将一天添加到@EndDate
  • tbl中选择dt位于修改后的@StartDate@EndDate之间的所有记录
    • 根据需要调整运算符以包含/排除@EndDate的精确值

此示例假定您的代码作为存储过程的一部分被调用,并将选择大于或等于@StartDate但小于@EndDate的所有日期(您不需要将相同的转换应用于dt):

-- Swap @StartDate and @EndDate values if need be
IF(@StartDate > @EndDate)
BEGIN
    DECLARE @TempDate DATETIME;
    SET @TempDate = @StartDate;
    SET @StartDate = @EndDate;
    SET @EndDate = @TempDate;
END;

-- Deliberately set @EndDate to one more than specified
-- Example case:
--                Before                   After
--     @StartDate '2015-08-08 06:30:00' => '2015-08-08 00:00:00'
--     @EndDate   '2015-08-08 12:00:00' => '2015-08-09 00:00:00'
SET @StartDate = dateadd(day,datediff(day,0,@StartDate),0);
SET @EndDate = dateadd(day,datediff(day,0,@StartDate)+1,0);

-- Query
select ID, dt from tbl1
WHERE dt >= @StartDate 
and dt < @EndDate