删除SQL Server中datetime时间部分的最佳方法

Ste*_*son 501 sql t-sql sql-server datetime date

从SQL Server中的datetime字段中删除时间部分时,哪种方法提供了最佳性能?

a) select DATEADD(dd, DATEDIFF(dd, 0, getdate()), 0)
Run Code Online (Sandbox Code Playgroud)

要么

b) select cast(convert(char(11), getdate(), 113) as datetime)
Run Code Online (Sandbox Code Playgroud)

第二种方法确实发送了更多的字节,但这可能没有转换速度那么重要.

两者似乎都非常快,但在处理数十万或更多行时速度可能会有所不同?

另外,是否有可能有更好的方法来摆脱SQL中日期时间的时间部分?

gbn*_*gbn 538

严格来说,方法a是资源最少的方法:

a) select DATEADD(dd, DATEDIFF(dd, 0, getdate()), 0)
Run Code Online (Sandbox Code Playgroud)

经证明,相同的总持续时间相对于相同的总持续时间一百万行的CPU占用时间过多:在SQL Server中从日期+时间获取日期的最有效方式是什么?

我在其他地方也看到了类似的测试结果.

我更喜欢DATEADD/DATEDIFF,因为:

编辑,2011年10月

对于SQL Server 2008+,您可以CAST到date.或者只是使用,date所以没有时间删除.

编辑,2012年1月

这是一个多么灵活的工作示例:需要通过sql server中的舍入时间或日期数字来计算

编辑,2012年5月

不要在WHERE子句等中使用它而不考虑:向列添加函数或CAST会使索引使用无效.请参见第2页:http://www.simple-talk.com/sql/t-sql-programming/ten-common-sql-programming-mistakes/

现在,这确实有一个后来SQL Server优化器版本的例子,管理CAST到目前为止正确,但通常这将是一个坏主意...

编辑,2018年9月,datetime2

DECLARE @datetime2value datetime2 = '02180912 11:45' --this is deliberately within datetime2, year 0218
DECLARE @datetime2epoch datetime2 = '19000101'

select DATEADD(dd, DATEDIFF(dd, @datetime2epoch, @datetime2value), @datetime2epoch)
Run Code Online (Sandbox Code Playgroud)

  • @David Sopko为2011年10月编辑然后代码将是:select cast(GETDATE()as date) (3认同)

Ant*_*ash 62

在SQL Server 2008中,您可以使用:

CONVERT(DATE, getdate(), 101)
Run Code Online (Sandbox Code Playgroud)

  • 从`datetime`转换为`date`时,第三个参数对结果完全没有影响,所以你的解决方案实际上归结为`CONVERT(DATE,getdate())`,这已被建议超过一旦. (12认同)
  • 只需使用 `CAST(GETDATE() AS DATE)` 或严格的 ANSI `CAST(CURRENT_TIMESTAMP AS DATE)`,我认为这是毫无价值的。留在第一个。 (4认同)

小智 46

当然,这是一个旧线程,但要完成它.

从SQL 2008开始,您可以使用DATE数据类型,这样您就可以执行以下操作:

SELECT CONVERT(DATE,GETDATE())
Run Code Online (Sandbox Code Playgroud)


Gar*_*ill 21

SELECT CAST(FLOOR(CAST(getdate() AS FLOAT)) AS DATETIME)
Run Code Online (Sandbox Code Playgroud)

  • 更不用说抛出浮动并返回日期时是不安全的 - 浮点数没有足够的精度.因此我认为根本不推荐.[有关更多详细信息,请参阅此帖子](http://stackoverflow.com/questions/2775/whats-the-best-way-to-remove-the-time-portion-of-a-datetime-value-sql-server/3696991#3696991). (3认同)

Met*_*hor 17

在SQL Server 2008中,存在DATE日期类型(也是TIME数据类型).

CAST(GetDate() as DATE)
Run Code Online (Sandbox Code Playgroud)

要么

declare @Dt as DATE = GetDate()
Run Code Online (Sandbox Code Playgroud)

  • CAST 和 CONVERT 在功能上是等效的。区别在于 CAST 是 ANSI 标准的一部分,而 CONVERT 特定于 T-SQL。因此,请尽可能使用 CAST。 (2认同)

Jef*_*ang 8

这是另一个答案,来自另一个重复的问题:

SELECT CAST(CAST(getutcdate() - 0.50000004 AS int) AS datetime) 
Run Code Online (Sandbox Code Playgroud)

此幻数方法的执行速度略快于DATEADD方法.(看起来像~10%)

几百万条记录的CPU时间:

DATEADD   MAGIC FLOAT
500       453
453       360
375       375
406       360
Run Code Online (Sandbox Code Playgroud)

但请注意,这些数字可能无关紧要,因为它们已经非常快.除非我有100,000或更多的记录集,否则我甚至无法将CPU时间读取到零以上.

考虑到DateAdd用于此目的并且更强大的事实,我会说使用DateAdd.

  • 那太可怕了。我从来没有像这样将我的数据置于危险之中。谁知道这是否适用于*所有*日期时间,而不仅仅是您测试的日期时间。 (2认同)

小智 5

SELECT CAST(CAST(GETDATE() AS DATE) AS DATETIME)
Run Code Online (Sandbox Code Playgroud)

  • 一个有效的选择,是的.但是,在这个帖子中建议不止一次. (4认同)

eme*_*hex 5

我很喜欢:

[date] = CONVERT(VARCHAR(10), GETDATE(), 120)
Run Code Online (Sandbox Code Playgroud)

120格式的代码将迫使日到ISO 8601标准:

'YYYY-MM-DD' or '2017-01-09'
Run Code Online (Sandbox Code Playgroud)

在dplyr(R)和pandas(Python)中超级好用!