使用DATEADD添加秒将返回一个四舍五入到分钟的值 - 为什么?
问题描述:
我需要添加LAST_DT(作为smalldatetime提供,但没有hhmmss)和LAST_TM(提供为nvarchar)来计算真实的DateTime值。
我正在尝试使用DateAdd来增加从LAST_TM提供的hhmmss的日期。 小时和分钟添加成功,但秒被四舍五入到分钟。 这里是我的代码使用DATEADD添加秒将返回一个四舍五入到分钟的值 - 为什么?
DECLARE @LAST_DT smalldatetime = '2017-10-18'
DECLARE @LAST_TM nvarchar(6) = '153954'
SELECT
@LAST_DT
,@LAST_TM
,DATEADD(minute, CAST(substring(@LAST_TM,3,2) AS INT),
DATEADD(hour, CAST(left(@LAST_TM,2) AS INT),@LAST_DT)) AS Dt_HhMm
,Right(@LAST_TM,2) As Secs
,DATEADD(second, CAST(Right(@LAST_TM,2) AS INT),
DATEADD(minute, CAST(substring(@LAST_TM,3,2) AS INT),
DATEADD(hour, CAST(left(@LAST_TM,2) AS INT),@LAST_DT))) AS Dt_HhMmSs
和相应的结果
LAST_DT LAST_TM Dt_HhMm Secs Dt_HhMmSs
2017-10-18 153954 2017-10-18 15:39:00 54 2017-10-18 15:40:00
为什么秒被四舍五入到最接近的分?
(我使用的MS SQL Server 2008 R2)
答
我想我几乎回答了我的问题。 LAST_DT是smalldatetime,根据定义,它不包含秒。 将LAST_DT投射为日期时间:
SELECT
CC.LAST_DT
,CC.LAST_TM
,DATEADD(second, CAST(Right(CC.LAST_TM,2) AS INT),
DATEADD(minute, CAST(substring(CC.LAST_TM,3,2) AS INT),
DATEADD(hour, CAST(left(CC.LAST_TM,2) AS INT),CAST(CC.LAST_DT As datetime))))
AS Dt+HhMmSs
解决了问题。
我很好奇,为什么smalldatetime会显示秒数,当它显式不是数据类型的一部分?这很混乱/误导。
答
你可以转换LAST_DT为datetime,然后添加LAST_TM在HH:MM:SS格式
CONVERT(datetime, CC.LAST_DT) + STUFF(STUFF(CC.LAST_TM, 3, 0, ':'), 6, 0, ':')
请编辑您的问题,并提供了一个最小的和可重复的例子。 –
@Tim Biegeleisen我认为我已修复,所以你可以重现它... – James