【发布时间】:2015-08-10 05:58:24
【问题描述】:
我有一个如下所述的 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 之前返回任何记录。
我不知道为什么会发生这种差异。任何帮助表示赞赏。
如果您需要更多说明,我会在这里回答。
【问题讨论】:
-
dt列是 DateTime 格式还是 varchar 格式? -
@Nitesh 对我来说效果很好,它显示了所有 5 条记录,其中包含两个 EndDate 值。
-
@CiucaS,它适用于我的本地计算机,但不适用于我无权访问的生产服务器。它在 prod 上运行良好,但仅在上午 6:30 之后而不是之前。我很困惑,因为无论参数值是什么,我都将查询中的所有 dt 列、startdate、enddate 更改为“2015-08-08 00:00:00”。
-
为什么不将
@StarDate转换为DATE而不是使用DATEADD/DATEDIFF`/ -
SQLFiddle 的行为与您描述的不同。 sqlfiddle.com/#!3/466aa/5/0您提供的示例数据未发现该问题。如果您获得的结果使用的数据与您在此处显示的数据不同,您可能需要分享这些数据,以便我们进一步帮助您。
标签: c# sql sql-server sql-server-2012