【发布时间】:2021-01-13 08:50:48
【问题描述】:
我将编写一个对日期时间值进行舍入的代码,但我无法比较哪个更有效:
DECLARE @DateValue DATETIME = '2021-01-13 11:59:59'
---- FIRST SOLUSTION:
SELECT CAST(@DateValue AS smalldatetime) AS DateRoundS1
---- SECOND SOLUTION:
SELECT CONVERT(smalldatetime, @DateValue) AS DateRoundS2
---- THIRD SOLUTION:
SELECT DATEADD(HOUR, DATEDIFF(HOUR, 0, @DateValue), 0) AS DateRoundS3
---- FORTH SOLUTION:
DECLARE @DateValue DATETIME = '2021-01-13 11:59:59'
DECLARE @DiffMinsTime INT = DATEPART(MINUTE,@DateValue)
DECLARE @DiffSecsTime INT = DATEPART(SECOND,@DateValue)
DECLARE @DiffMSTime INT = DATEPART(MILLISECOND,@DateValue)
IF( @DiffMinsTime > 0 )
BEGIN
SELECT DATEADD(MINUTE,DATEDIFF(MINUTE,@DiffMinsTime,@DateValue),0)
END
IF(@DiffSecsTime > 0)
BEGIN
SELECT DATEADD(SECOND,DATEDIFF(SECOND,@DiffSecsTime,@DateValue),0)
END
IF(@DiffMSTime > 0)
BEGIN
SELECT DATEADD(MILLISECOND,DATEDIFF(MILLISECOND,@DiffMSTime,@DateValue),0)
END
PS:我知道最后一个溢出了!! 有没有更有效的方法来做到这一点?!
【问题讨论】:
-
什么是“高效”?正在尝试转换数百万行?告诉我们一些背景信息!
-
但是
CAST和CONVERT非常快,但许多日期和时间函数也是如此(例如DATEADD和DATEDIFF)。你想把时间“圆”到这里吗? -
Tip1 - 使用 DATETIME2
-
1 & 2 完全相同,
CAST只是调用CONVERT。 3也会很快。 4 看起来很慢。我通常做CAST(@DateValue AS date) -
除了
cast()/convert()之外,你为什么会考虑使用other?
标签: sql sql-server datetime