这些日期where-clause之间的区别是什么?

时间:2011-08-04 15:08:03

标签: sql sql-server tsql

这两个查询返回不同的订单数量,并不清楚原因。第一个where子句是已接受的correct版本:

where
year(OrderDate) = 2011
and MONTH(OrderDate) = 8
and DAY(OrderDate) = 3

但如果我说的话非常相似:

WHERE 
io.OrderDate >= '2011-08-03 00:00:00' 
and io.OrderDate <= '2011-08-03 11:59:59'

我得到了完全不同的记录数。在日期格式化中我有什么问题吗?或者我在逻辑中缺少什么?我更愿意说后者,因为它更容易使用恕我直言。

3 个答案:

答案 0 :(得分:5)

编辑:

我建议的新答案将我原来的答案(如下所示)与Mikael和Alex的评论结合起来。

WHERE 
io.OrderDate >= '2011-08-03 00:00:00' 
and io.OrderDate < '2011-08-04 00:00:00'

应该提供所需的结果。


第二个查询只是从午夜到中午。 (00:00:00 - 11:59:59是十二小时)

WHERE 
io.OrderDate >= '2011-08-03 00:00:00' 
and io.OrderDate <= '2011-08-03 23:59:59'

应该修理它。

@Alex答案也有一点意义。毫秒计数(取决于您的特定表是否包含它们)。

WHERE 
io.OrderDate >= '2011-08-03 00:00:00.000' 
and io.OrderDate <= '2011-08-03 23:59:59.999'

会包含任何其他错过的记录

答案 1 :(得分:3)

嗯,11:59:59就在中午之前(那是 am 你引用的),这意味着你错过了12个小时。

另外,请记住,您还可以在DateTime中指定毫秒数。所以你可以'2011-08-03 23:59:59.100',这是在指定的最大OrderDate之后(即使在纠正了24小时后)

答案 2 :(得分:3)

你应该这样做。

WHERE 
io.OrderDate >= '2011-08-03 00:00:00' 
and io.OrderDate < '2011-08-04 00:00:00'

除了您的查询中的rowcount不同之外,第一个将无法在OrderDate列上使用任何索引。