【问题标题】:Date Comparison in TSQL [duplicate]SQL中的日期比较[重复]
【发布时间】:2015-12-14 17:40:29
【问题描述】:

为什么下面的每一个都返回记录:

SELECT Name, CreatedDate 
FROM EmployeeTable 
WHERE CreatedDate < '20151214'

SELECT Name, CreatedDate 
FROM EmployeeTable 
WHERE CreatedDate > '20151214'

而下面的查询没有?

SELECT Name, CreatedDate 
FROM EmployeeTable 
WHERE CreatedDate = '20151214'

我必须使用 CAST 和相等运算符来获得我想要的结果:

SELECT Name, CreatedDate 
FROM EmployeeTable 
WHERE CAST(CreatedDate as DATE) = '2015-12-14'

有什么方法可以使用相等运算符而不必使用强制转换?

CreatedDateDATETIME 类型,包括时间。

【问题讨论】:

  • 是 CreatedDate DATE 还是 DATETIME?
  • @lad2025 是的 -
  • 所以答案很简单,你和2015-12-14T00:00:00比较,没有完全匹配

标签: sql sql-server sql-server-2012 sqldatetime


【解决方案1】:

可能CreatedDate 包含一个时间部分(例如类型为datetime)。这就是为什么= 不能开箱即用的原因。当您将其转换为 date 时,时间部分被删除,然后 = 比较工作正常。

【讨论】:

  • 它确实包含一个时间部分(它是一个日期时间类型),但它适用于 但不适用于 =
  • 好吧,时间部分并没有搞乱&lt;&gt; 的比较。想想,这很正常。例如 '20140101 3 PM' 仍然大于 '20140101' 但不等于它。
  • 如果在CreatedDate 上有索引,执行查询的最佳方式是:Select Name, CreatedDate from EmployeeTable where CreatedDate &gt;= '20151214' and CreatedDate &lt; '20151215',否则 MSSQL 可能会运行全表扫描。
【解决方案2】:

DATEDIFF 是在 SQL 中检查日期相等性的首选方法,除非您使用较新的 DATE 类型(而不是 DATETIME)。

投射到DATE 会删除任何时间部分。

DATEDIFF 可能也更健壮(比 =)

【讨论】:

  • AFAIK,DATEDIFF 比较慢,如果我们可以使用 ,我们最好使用它们。
  • 其实我认为它并不慢,尤其是对于相等性测试。 DATEDIFF 优化得非常好。对于,您可能是正确的。除非你有一些性能统计数据:)
  • 我不知道。但我在一本好书中读过。
  • @Grantly:与其他方法相比,您对DATEDIFF 的性能有任何参考/基准吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-09-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-14
  • 2014-05-15
  • 1970-01-01
相关资源
最近更新 更多