【问题标题】:Proper Way To Compare Short Dates (SQL Server 2005)比较短日期的正确方法 (SQL Server 2005)
【发布时间】:2011-09-01 03:54:05
【问题描述】:

目前我正在以这种方式比较短日期:

CONVERT(datetime,CONVERT(VARCHAR(10), return_date,101)) = '{0}'

我的主管说我应该这样做:

datepart(month,return_date)= 5   
and  datepart(day,return_date)=24   
and  datepart(year,return_date)=2011 

因为函数 CONVERT 识别的定义值 101 将来可能会改变。真的吗?这些参数值多久更改一次?过去有变化吗?有没有更好的方法来比较日期的短形式?

【问题讨论】:

  • 如果您的两个日期是短日期数据类型,则不需要转换或日期部分。您可以简单地进行比较: where dt1 = dt2
  • 抱歉,我应该指定我们正在比较确实有时间成分的日期,因此需要只比较日期成分而不是时间

标签: sql sql-server-2005 datetime


【解决方案1】:

如果“短日期”是指“只是没有时间的日期”

Select ...
From MyTable
Where return_date >= '20110524'
    And return_date < DateAdd(d, 1, '20110524')

首先,请注意 Where 子句第二部分中的 &lt;。其次,如果return_date 上有索引,这种方法将使用它。另一种不使用索引(从而导致表扫描)的解决方案是:

Select ...
From MyTable
Where DateAdd(d, DateDiff(d, 0, return_date), 0) = '20110524'

如果return_date 总是在没有时间分量的情况下被存储(即它的时间分量总是午夜),那么你可以做一个简单的比较:

Select ...
From MyTable
Where return_date = '20110524'

【讨论】:

  • 感谢您的详细回答。您能否就 CONVERT 函数的日期格式参数是否有可能改变发表您的看法?
  • @enamrik - 它可能不会改变,但这也不是比较日期的最佳方式。通过对列执行函数,您将强制执行表扫描,无论您是否在 return_date 上有索引。如果 return_date 中的值可以包含时间分量,那么我的第一个解决方案是最好的。如果 return_date 中的值永远不会有时间分量,那么我的最后一个解决方案是最好的。您不需要使用 Convert。
  • @enamrik - 顺便说一句,我还要补充一点,在 SQL Server 2008 中,有一个 Date 数据类型,它只存储日期部分,应该消除剥离时间部分的问题。跨度>
  • 感谢您的洞察力。我们实际上需要时间组件,但您对索引的洞察力给了我我不知道我正在寻找的答案,谢谢!
【解决方案2】:

除了添加转换样式之外,convert() 及其转换样式自 SQL Server 4.2 以来没有改变,c。 1992 年,当时它与 OS/2 捆绑在一起。

【讨论】:

  • +1 同意。这将是一个重大的突破性变化。机会渺茫。
  • 谢谢,我现在正在寻找证明这一点的文档。我迫不及待地想告诉我的主管,我已经尝到了!
【解决方案3】:

这是我的偏好:

SELECT foo
FROM bar
WHERE return_date = CONVERT(datetime, FLOOR(CONVERT(float, Getdate())))

或者,如果 return_date 有时间戳

SELECT foo
FROM bar
WHERE CONVERT(datetime, FLOOR(CONVERT(float, return_date))) = CONVERT(datetime, FLOOR(CONVERT(float, Getdate())))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-12-04
    • 1970-01-01
    • 2015-08-28
    • 1970-01-01
    • 1970-01-01
    • 2016-11-21
    • 2021-11-03
    • 1970-01-01
    相关资源
    最近更新 更多