2017-10-19 11 views
1

true DateTime値を計算するために、LAST_DT(smalldatetimeとして提供されますがhhmmssなし)とLAST_TM(nvarcharとして提供)を追加する必要があります。
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(SECOND、LAST_TM/10000 * 3600 +(LAST_TM%10000)/ 100 * 60 + LAST_TM%100、LAST_DT)'である。少なくともそれは部分文字列/キャスト関数を避ける。 – ZLK

1

あなただけの日時にLAST_DTを変換して、HHでLAST_TMを追加することができます:MM:SS形式

CONVERT(datetime, CC.LAST_DT) + STUFF(STUFF(CC.LAST_TM, 3, 0, ':'), 6, 0, ':') 
関連する問題