我有一个如下所述的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之前返回任何记录。
我没有线索为什么会发生这种差异。任何帮助表示赞赏。
如果您需要进一步澄清,我会在这里回答。
答案 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