2013-12-13 192 views
1

我在SQL报告中遇到这条代码,我试图修复。有人可以告诉我这是什么目的。为什么有人会用这个?

DATEADD(dd, - DATEDIFF(dd, d.TxnDateTime, 1), 1) As TxnDate 

对我来说,它似乎会取消自己。

+1

将DATETIME转换为DATE懒惰? – Joe

+3

更好的方法是'cast(d.TxnDateTime as Date)'。 –

+0

+1为迄今为止施放的独特方式。 –

回答

5

它将删除DATETIMETIME部分而不更改数据类型。 您可以观察到不同的行为在这里:SQL Fiddle

同样,不知道为什么你需要保持DATETIME型,同时消除了时间,除非它先于DATE数据类型。

1

Date数据类型已添加到SQL 2008 per MSDN中。在SQL 2008之前,此公式是截断DateTime变量的时间的一种方法。

6

它很可能是为SQL Server 2005编写的,当时CONVERT(DATE只是微软员工眼中的一丝曙光,而且我们不得不使用繁琐,低效和难以解释的解决方法来删除DATETIME的时间部分。

当然,人们仍然使用那些繁琐,高效且难以解释的方法。但我不认为这里有人会告诉你为什么,特别是如果你正在寻找特定开发人员在特定情况下选择特定格式的原因。我们根本无法为他们说话。也许他们把它从别的地方偷走了,也许这对他们来说实际上是有意义的,也许他们只是在不知道它做什么的情况下插入它。

今天,更好的办法是:

CONVERT(DATE, d.TxnDateTime); 

...我已经证明过很多次,包括herehere。现在

,如果你试图让所有的行,其中d.TxnDateTime落在某一天,一个更好的方法是使用一个DATE参数,以及开放式的范围查询:

WHERE d.TxnDateTime >= @ThatDay 
    AND d.TxnDateTime < DATEADD(DAY, 1, @ThatDay); 

这优于:

WHERE CONVERT(DATE, d.TxnDateTime) = @ThatDay; 

因为,尽管这个表达式仍然可以导致相当差的基数估计值,欲了解更多信息,请参阅本非常彻底职位:

https://dba.stackexchange.com/questions/34047/cast-to-date-is-sargable-but-is-it-a-good-idea

也可能不是一个坏主意,阅读这一个:

http://sqlblog.com/blogs/aaron_bertrand/archive/2009/10/16/bad-habits-to-kick-mishandling-date-range-queries.aspx

而且还这对于dd

http://sqlblog.com/blogs/aaron_bertrand/archive/2011/09/20/bad-habits-to-kick-using-shorthand-with-date-time-operations.aspx

1

看来以前的代码作者是试图将DATETIME对象转换为DATE对象......基本上删除时间组件(HH:MM:SS)。更常见的方法是:

SELECT CAST(d.TxnDateTime AS DATE) AS [TxnDate] 
相关问题