我需要添加 LAST_DT(以小日期时间形式提供,但不带 hhmmss)和 LAST_TM(以 nvarchar 形式提供)来计算真实的日期时间值。
我正在尝试使用DateAdd增加 LAST_TM 中 hhmmss 提供的日期。
小时和分钟添加成功,但秒数向上或向下舍入为分钟。
这是我的代码
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 是小日期时间,根据定义不包括秒。 将 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
解决了问题。
我很好奇为什么小日期时间会显示秒,而这显然不是数据类型的一部分?这非常令人困惑/误导。
关于sql-server - 使用 DATEADD 添加秒数会返回四舍五入为分钟的值 - 为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46821755/