使用DATEADD添加秒数会返回一个舍入为分钟的值 - 为什么?

时间:2017-10-19 01:53:37

标签: sql-server tsql datetime

我需要添加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)

2 个答案:

答案 0 :(得分:1)

我想我几乎回答了自己的问题。 LAST_DT是smalldatetime,根据定义,它不包括秒。 将LAST_DT转换为datetime:

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会显示秒数,而这显然不是数据类型的一部分?这非常令人困惑/误导。

答案 1 :(得分:1)

您只需将LAST_DT转换为日期时间,然后以HH:MM:SS格式添加LAST_TM

environment