2017-10-19 44 views
1

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

+0

请编辑您的问题,并提供了一个最小的和可重复的例子。 –

+0

@Tim Biegeleisen我认为我已修复,所以你可以重现它... – James

回答

1

我想我几乎回答了我的问题。 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会显示秒数,当它显式不是数据类型的一部分?这很混乱/误导。

+0

我也有兴趣看看有没有人有更好/更快/更简洁的方式来执行此添加返回日期时间值! – James

+0

'为什么smalldatetime会显示秒数,这就是SSMS如何显示数据 – Squirrel

+0

Smalldatetime显示秒数,因为这只是datetime的默认显示。至于“简化”它,我想你可以使用整数除法和模数的组合?例如'DATEADD(秒,LAST_TM/10000 * 3600 +(LAST_TM%10000)/ 100 * 60 + LAST_TM%100,LAST_DT)'。至少可以避免子字符串/强制转换功能。 – ZLK

1

你可以转换LAST_DT为datetime,然后添加LAST_TM在HH:MM:SS格式

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