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)
Ant*_*ash 62
在SQL Server 2008中,您可以使用:
CONVERT(DATE, getdate(), 101)
Run Code Online (Sandbox Code Playgroud)
小智 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)
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)
这是另一个答案,来自另一个重复的问题:
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.
小智 5
SELECT CAST(CAST(GETDATE() AS DATE) AS DATETIME)
Run Code Online (Sandbox Code Playgroud)
我很喜欢:
[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
)中超级好用!
归档时间: |
|
查看次数: |
725533 次 |
最近记录: |