2011-05-24 61 views
1

目前我比较短日期是这样的:有道比较短日期(SQL Server 2005中)

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可能在将来改变。真的吗?这些参数值多久改变一次?过去有过改变吗?是否有更好的方法来比较日期的简短形式?

+0

如果你的两个日期都在短日期型数据不需要转换或日期部分。你可以比较一样简单:其中dt1 = dt2 – ibram 2011-05-24 17:59:43

+0

对不起,我应该指定我们比较具有时间分量的日期,因此只需要比较日期分量而不是时间 – enamrik 2011-05-24 18:34:07

回答

3

如果“短日期”你的意思是“不只是时间的日期”

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

首先,请注意<在where子句中的第二部分。其次,如果return_date上有索引,则此方法将使用它。这将不利用索引(并且因此导致表扫描)另一解决方案是:

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

如果return_date总是存储没有它的时间分量(即,它的时间分量总是午夜),则可以做一个简单的比较:

​​
+0

感谢您的详细解答。您是否也可以分享您的意见,以确定CONVERT函数的日期格式参数是否可能更改? – enamrik 2011-05-24 18:29:44

+0

@enamrik - 它可能不会改变,但这也不是比较日期的最佳方式。通过在列上执行一个函数,无论在return_date上是否有索引,都将强制进行表扫描。如果return_date中的值可以有时间分量,那么我的第一个解决方案是最好的。如果return_date中的值永远不会有时间分量,那么我最后的解决方案是最好的。你不应该需要使用转换。 – Thomas 2011-05-24 18:33:29

+0

@enamrik - 顺便说一句,让我补充一点,在SQL Server 2008中,有一个'Date'数据类型,它只存储日期部分,并且应该消除这个剥离时间部分的问题。 – Thomas 2011-05-24 18:34:36

1

将转换风格,convert()其转换风格,因为SQL服务器4.2,C并没有改变之外。 1992年,当时它与OS/2捆绑在一起。

+0

+1同意。这将是一个重大的突破性改变。机会很渺茫。 – 2011-05-24 18:01:17

+0

谢谢,我正在寻找文档来证明这一点。我等不及要告诉我的主管,我已经可以品尝它了! – enamrik 2011-05-24 18:32:38

0

这是我的偏好:

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

,或者,如果返回的航班具有时间戳

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