2017-10-19 45 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, ':')