匹配日期(年,月,日)的值,但不是时间

时间:2014-08-27 15:51:53

标签: sql sql-server datetime

this answer中,建议使用以下语法全天匹配给定日期。

select * from Info
  where DateColumn 
    between '2014-08-25 00:00:00' 
    and '2014-08-25 23:59:59'

除了我们错过了每一天的最后一秒,这实际上可能不是一个大问题,但主要可能是一个交易破坏者,我不明白为什么不使用下面的简单表达。 / p>

匹配是在半开的时间间隔内进行的,上限是独占的(即 fromAndInclusive< = date< toButNotInclusive ),并且假定没有指定任何时间的日期在午夜(即00:00:00.000)。

select * from Info
  where DateColumn 
    between '2014-08-25' and '2014-08-26'

请注意,在SQL方面,我甚至没有声称拥有任何级别的能力,所以这个问题不应该指出任何错误。我很自大,但是当谈到DB时,我已经被贬低了一两次。 :)

2 个答案:

答案 0 :(得分:3)

两者都会返回不正确的结果。

Between 包含 两个结束,因此您的第一个查询

select * from Info
  where DateColumn 
  between '2014-08-25 00:00:00' 
  and '2014-08-25 23:59:59'

会忽略2014-08-25最后一秒内的任何内容。

你提出的第二个问题太贪心了。它将包括26日午夜正好的任何内容,即2014-08-26 00:00:00

select * from Info
  where DateColumn 
  between '2014-08-25' and '2014-08-26'

要获得所需的结果,您应该在评论中指出>=<(如@Lamak):

select * from Info
  where DateColumn >= '2014-08-25' and DateColumn < '2014-08-26'.

鉴于表中的以下数据:

2014-08-25 23:59:59
2014-08-25 23:59:59.500
2014-08-26 00:00:00
2014-08-26 00:00:00.500
2014-08-26 00:00:01

第一个查询只匹配:

2014-08-25 23:59:59.000

第二场比赛:

2014-08-25 23:59:59.000
2014-08-25 23:59:59.500
2014-08-26 00:00:00.000 --this is wrong!

最后第三次(正确)匹配:

2014-08-25 23:59:59.000
2014-08-25 23:59:59.500

答案 1 :(得分:-1)

select * from Info
  where DateColumn >='2014-08-25 00:00:00' 
    and datecolumn<='2014-08-25 23:59:59'