2016-04-17 7 views
0

私はこの問題を数日間抱えていましたが、なぜgetdate()の挿入がミリ秒の10進数を提供するのかわからないようです。私はまだ10進形式のdatediff()の結果を引き出すことができないようです。それは周辺の文字のために小数点を認識しないエンジンと関係がありますか?10進値を含む2つのタイムスタンプのdatediff()

私が使用:

select datediff(s,'2013-06-01 21:59:59.141','2013-06-01 23:59:59.997') 

それが返されます。

7200 

そして、私が使用します。

select cast(datediff(s,'2013-06-01 21:59:59.141','2013-06-01 23:59:59.997') as float); 

それが返されます。

7200 

私は10進値になるために私が紛失しているものを紛失しています。

おかげ

+1

'datediff 'の戻り値の型は' int'です。あなたが '浮動小数点型に'キャストしても、同じ結果が得られます。 –

答えて

1

DATEDIFF(MSは、...)長い時間のために守ることにまたがっているか、それがオーバーフロー与える必要があることに注意してください:オーバーフローセーフであるとあなたにフロートを与える方法以下を使用でき

SELECT datediff(MS, '2013-06-30 23:59:59.997', '2013-06-01 21:59:59.141') 
-- FAILURE: The datediff function resulted in an overflow. The number of dateparts separating two date/time instances is too large 

を結果:

SELECT cast(cast('2013-06-01 23:59:59.997' as datetime)-cast('2013-06-01 21:59:59.141' as datetime) as float) * 24.0 
-- Returned 2.00023796296296 

SELECT cast(cast('2013-06-30 23:59:59.997' as datetime)-cast('2013-06-01 21:59:59.141' as datetime) as float) * 24.0 
-- Returned 698.000237962963 

測定された期間中にタイムゾーンが変更された場合、この方法がどのように機能するかわかりません。

+0

よろしくお願いします。ありがとう! –

+0

これは、datetimeデータ型に既に存在するため、datetimeとしてキャストする必要がなくなりました。 パンチから経過した(cast(punch_out - punch_in as float)* 24,4) punch_outとpunch_inは既にdatetimesだったので、これは完璧に働いた、ありがとう! –

3

あなたは違いのミリ秒を取得しようとしている、とあなたは秒に単位を変換したい場合は、以下のようなものを使用して試すことができます:

SELECT DATEDIFF(MS,'2013-06-01 21:59:59.141','2013-06-01 23:59:59.997')/1000.0 

それはよ生成物:7200.856000

+0

その規模の計算は、大量のデータに対してパフォーマンスに影響しますか?私が言及しなかったのは、私の最終結果が4桁に丸められた数時間であり、このシンタックスが大規模なデータセットにわたって実装されている場合、パフォーマンスを懸念していました。 選択ラウンド(cast((2013-06-01 21:59:59.141 '、' 2013-06-01 23:59:59.997 ')/ 1000.00)/ floatとしての3600) –

+0

ありがとう、それは動作し、今私は2.0002時間を返します。私はこれがパフォーマンスを賢明にする最適なルートかどうかは分かりませんでした。私がフロートとしてキャストしなければ、それは2.000200000000を返すでしょう。 –

関連する問題