繁体   English   中英

使用DATEADD添加秒将返回四舍五入的值-为什么?

[英]Adding seconds using DATEADD is returning a value rounded to minutes - why?

我需要添加LAST_DT(提供为smalldatetime但没有hhmmss)和LAST_TM(提供为nvarchar)来计算真实的DateTime值。
我正在尝试使用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是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转换为日期时间,然后以HH:MM:SS格式添加LAST_TM

CONVERT(datetime, CC.LAST_DT) +  STUFF(STUFF(CC.LAST_TM, 3, 0, ':'), 6, 0, ':')

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM