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

Sql server 使用DATEADD添加秒将返回四舍五入为分钟的值-为什么?,sql-server,tsql,datetime,Sql Server,Tsql,Datetime,我需要添加LAST_DT(作为smalldatetime提供,但没有hhmmss)和LAST_TM(作为nvarchar提供)来计算真实的日期时间值。 我试图使用从LAST_TM开始增加随HHMMS提供的日期。 小时和分钟已成功添加,但秒正在向上或向下舍入为分钟。 这是我的密码 DECLARE @LAST_DT smalldatetime = '2017-10-18' DECLARE @LAST_TM nvarchar(6) = '153954' SELECT @LAST_DT ,@LAS

我需要添加LAST_DT(作为smalldatetime提供,但没有hhmmss)和LAST_TM(作为nvarchar提供)来计算真实的日期时间值。
我试图使用从LAST_TM开始增加随HHMMS提供的日期。 小时和分钟已成功添加,但秒正在向上或向下舍入为分钟。 这是我的密码

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,根据定义,它不包括秒。 将最后一个日期转换为日期时间:

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,然后以HH:MM:SS格式添加LAST_TM

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

请编辑您的问题,并提供一个最小且可复制的示例。@Tim Biegeleisen我想我已经修复了这个问题,以便您可以复制它…我还想看看是否有人有更好/更快/更简洁的方法来执行此添加以返回日期时间值<代码>为什么smalldatetime将以秒显示这正是SSMS显示dataSmalldatetime的方式显示秒,因为这只是datetime的默认显示。至于“简化”它,我想你可以使用整数除法和模的组合?e、 g.
DATEADD(第二个,最后一个TM/10000*3600+(最后一个TM%10000)/100*60+最后一个TM%100,最后一个DT)
。至少这避免了子字符串/转换函数。谢谢@ZLK(我没想到你可以在nvarchar上使用算术运算而不先转换/转换它)。datetime hh:mm:ss.000(时间部分)的默认显示不是吗?