SQL查询中的日期范围的DATEDIFF()或BETWEEN

Ben*_*rey 4 mysql sql sql-server datediff

我最近被告知BETWEEN在SQL中使用该方法有点不可靠,因此我应该使用它DATEDIFF().但是,另一位程序员告诉我情况并非如此,BETWEEN只要日期格式正确,该方法在所有情况下都能很好地运行.

请有人通过陈述哪种方法更好以及为什么解决这个问题?

目前我的日期范围SQL如下所示:

DATEDIFF(d,'01-Jan-1970',SIH.[Something_Date]) >= 0 AND DATEDIFF(d,'01-Jan-2013',SIH.[Something_Date]) <= 0
Run Code Online (Sandbox Code Playgroud)

但是,如果我能确定它是可靠的,我宁愿这样写它:

SIH.[Something_Date] BETWEEN '01-Jan-1970' AND '01-Jan-2013'
Run Code Online (Sandbox Code Playgroud)

在这种特殊情况下,我使用的是MsSQL,但是,我已经标记了MySQL,因为我想知道这是否也适用于此

Mik*_*son 5

您的两个查询不相同.该datediff版本将包括所有值,01-Jan-2013而不管时间,而版本之间将仅包括01-Jan-2013时间的行00:00:00.

如果检查范围并且不对列进行任何计算,则查询将能够使用索引,Something_Date同时包括所有值,01-Jan-2013而不管时间部分.

where
  SIH.[Something_Date] >= '19700101' and
  SIH.[Something_Date] < '20130102'
Run Code Online (Sandbox Code Playgroud)

  • @BenCarey是的,这就是我的意思.当开发人员发现它们通常会在"下一天"之间进行,而不是副作用,它们包含第二天时间为"00:00:00"的行.当他们发现这一点时,他们会在中间写下"20130101 23:59:59"并在最后一秒错过.当他们弄明白时,他们会尝试`20130101 23:59:59.999`,只是为了发现`datetime`值的精度为3 ms,所以它被舍入到'20130102 00:00:00`.到那时他们希望停止使用,即使`20130101 23:59:59.997`确实有效,至少对于'datetime`. (2认同)