【问题标题】:Between Date is not working in SQL SERVER日期之间在 SQL SERVER 中不起作用
【发布时间】:2014-02-26 11:40:37
【问题描述】:

我有一个非常简单的 SQL,可以从日期范围内选择数据。所以,例如,如果我有,

SELECT ...... WHERE PV.[Time] BETWEEN '02/26/2014' AND '02/26/2014'

此 SQL Select 语句未选择 2014 年 2 月 26 日的数据。请帮忙

【问题讨论】:

  • 你应该用CONVERT转换格式
  • 好吧 - 有没有时间等于 2014 年 2 月 26 日的行?如果是这样,您的 SQL Server 是否设置为处理该格式的日期?如果您尝试将查询更改为:'20142602' AND '20142602'
  • 无论如何都不要在这里使用BETWEEN。除非打算包含恰好在 2 月 26 日午夜但在该日期没有其他时间的行。
  • @MartinSmith,那我该怎么办?艾伦,是的,有行
  • @user960567 参考 MartinSmith 关于包含包含日期的行的评论,我使用 CAST CEILING 技巧取得了巨大成功,因此排除了时间 CAST(CEILING(CAST(@MyDate AS FLOAT)) AS DATETIME)。地板也可以。见这里stackoverflow.com/questions/85373/floor-a-date-in-sql-server

标签: sql date sql-server-2012


【解决方案1】:

您当前的语句BETWEEN '02/26/2014' AND '02/26/2014' 在左右两侧的值相同,因此等价于= '02/26/2014'

这只会在 2 月 26 日午夜恢复行。使用

 WHERE PV.[Time] >= '20140226' AND PV.[Time] < '20140227'

【讨论】:

  • 意味着这不会花时间。带上 26 日的所有记录?
  • @user960567 - 是的,这将带回 26 日的所有行,无论时间分量如何。
  • 非常好。赞赏
【解决方案2】:

最好对日期使用不可疑​​的字符串格式(1/2/2000 可以解释为 01-feb-2000 或 02-jan-2000,具体取决于您的本地设置)。我更喜欢 ISO 格式 yyyymmdd 或 ODBC 规范 yyyy-mm-dd 并且在处理日期时总是使用 CONVERT 来明确。但这不是你的问题:)

您的查询的问题在于您实际上是在过滤日期BETWEEN '02/26/2014 00:00:00' AND '02/26/2014 00:00:00',因此您只能在确切的日期时间获得值。要获取全天 02/26/2014 的日期时间值,请使用以下命令:

SELECT ...
WHERE PV.[Time] >= '2014-02-26' AND PV.[Time] < dateadd(day, 1, '2014-02-26');

【讨论】:

  • 你说得对,@MartinSmith,我知道这种极端情况,但认为并不重要。代码已更正为完全正确。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-11-17
  • 1970-01-01
  • 2023-01-05
  • 1970-01-01
  • 1970-01-01
  • 2016-12-11
  • 1970-01-01
相关资源
最近更新 更多