Sql 为什么会有人用这个?

Sql 为什么会有人用这个?,sql,sql-server-2008,tsql,datediff,dateadd,Sql,Sql Server 2008,Tsql,Datediff,Dateadd,我在试图修复的SQL报告中遇到了这行代码。有人能告诉我这是为了什么吗 DATEADD(dd, - DATEDIFF(dd, d.TxnDateTime, 1), 1) As TxnDate 在我看来,它似乎会自动取消。它正在删除DATETIME中的TIME部分,而不更改数据类型。 您可以在此处观察不同的行为: 同样,不确定在删除时间时为什么需要保留DATETIME类型,除非它早于DATE数据类型。它删除DATETIME的time部分而不更改数据类型。 您可以在此处观察不同的行为: 同样,不确定

我在试图修复的SQL报告中遇到了这行代码。有人能告诉我这是为了什么吗

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

在我看来,它似乎会自动取消。

它正在删除
DATETIME
中的
TIME
部分,而不更改数据类型。 您可以在此处观察不同的行为:


同样,不确定在删除时间时为什么需要保留
DATETIME
类型,除非它早于
DATE
数据类型。

它删除
DATETIME
time
部分而不更改数据类型。 您可以在此处观察不同的行为:


同样,不确定在删除时间时为什么需要保留
日期时间
类型,除非它早于
日期
数据类型。

SQL 2008中添加了
日期
数据类型。在SQL 2008之前,此公式是从
DateTime
变量截断时间的一种方法。

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

它可能是为SQL Server 2005编写的,当时
转换为(DATE
在一些微软员工眼中只是一个微光,当我们不得不使用繁琐、低效且难以解释的变通方法来删除
日期时间的时间部分时

当然,人们仍然使用那些笨重、高效、难以解释的方法。但我不认为这里的任何人都能告诉你为什么,特别是如果你在寻找特定开发人员在特定情况下选择特定格式的原因。我们无法为他们说话。也许他们从其他地方偷了,也许是真的ly对他们来说很有意义,也许他们只是在不知道它的功能的情况下插入了它

今天,更好的方法是:

CONVERT(DATE, d.TxnDateTime);
…我已经多次证明了这一点,包括和

现在,如果您试图获取
d.TxnDateTime
位于特定日期的所有行,更好的方法是使用
DATE
参数和开放式范围查询:

WHERE d.TxnDateTime >= @ThatDay
  AND d.TxnDateTime <  DATEADD(DAY, 1, @ThatDay);
因为,尽管这个表达式是可搜索的,但它仍然会导致基数估计值很低。有关更多信息,请参阅这篇非常全面的文章:

阅读这篇文章也可能不是个坏主意:

这也是关于
dd:


它可能是为SQL Server 2005编写的,当时
CONVERT(DATE
在某些Microsoft员工眼中只是一个微光,我们不得不使用繁琐、低效且难以解释的变通方法来删除
DATETIME
的时间部分

当然,人们仍然使用那些笨重、高效、难以解释的方法。但我不认为这里的任何人都能告诉你为什么,特别是如果你在寻找特定开发人员在特定情况下选择特定格式的原因。我们无法为他们说话。也许他们从其他地方偷了,也许是真的ly对他们来说很有意义,也许他们只是在不知道它的功能的情况下插入了它

今天,更好的方法是:

CONVERT(DATE, d.TxnDateTime);
…我已经多次证明了这一点,包括和

现在,如果您试图获取
d.TxnDateTime
位于特定日期的所有行,更好的方法是使用
DATE
参数和开放式范围查询:

WHERE d.TxnDateTime >= @ThatDay
  AND d.TxnDateTime <  DATEADD(DAY, 1, @ThatDay);
因为,尽管这个表达式是可搜索的,但它仍然会导致基数估计值很低。有关更多信息,请参阅这篇非常全面的文章:

阅读这篇文章也可能不是个坏主意:

这也是关于dd:


前面的代码作者似乎试图将日期时间对象强制转换为日期对象…基本上删除了时间组件(HH:MM:SS)。更常见的方法是:

SELECT CAST(d.TxnDateTime AS DATE) AS [TxnDate]

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

SELECT CAST(d.TxnDateTime AS DATE) AS [TxnDate]

将日期时间延迟转换为日期?对于转换为日期的特殊方式,更好的方式是
cast(d.txndateime as DATE)
+1。它可能来自SQL Server没有
DATE
数据类型的时候。将日期时间延迟转换为日期?更好的方式是
cast(d.txndateime as DATE)
+1用于转换为日期的特殊方式。它可能来自SQL Server没有
date
数据类型的时代。