16

こんにちは、datetime2 型の 2 つの列の差を計算しようとしています。

ただし、SQL サーバー (2012) は次のことを好まないようです。

select cast ('2001-01-05 12:35:15.56786' as datetime2)
    - cast ('2001-01-01 23:45:21.12347' as datetime2);

Msg 8117, Level 16, State 1, Line 2
Operand data type datetime2 is invalid for subtract operator.

日時型にキャストすると機能するようになりました。

select cast (cast ('2001-01-05 12:35:15.56786' as datetime2) as datetime) 
    - cast (cast ('2001-01-01 23:45:21.12348' as datetime2) as datetime);

1900-01-04 12:49:54.443

ただし、datetime にキャストすると精度が失われます (上記の 3 桁の精度に注意してください)。この場合、実際には小数点以下 5 桁すべてが必要です。2 つの datetime2 列の間の間隔を取得し、小数点以下 5 桁の精度を維持する方法はありますか? ありがとう。

4

3 に答える 3

23

単純にDateDiffを使用できます

指定された開始日と終了日の間に交差する指定された日付部分の境界の数 (符号付き整数) を返します。

select DATEDIFF(MILLISECOND, cast('20010101 23:45:21.12347' as datetime2), 
                             cast('20010105 12:35:15.56786' as datetime2))

残念ながら、これで必要な精度を得ようとしています:

select DATEDIFF(MICROSECOND, cast('20010101 23:45:21.12347' as datetime2), 
                             cast('20010105 12:35:15.56786' as datetime2)) 

オーバーフロー エラーが発生します。

The datediff function resulted in an overflow. 
The number of dateparts separating two date/time instances is too large. 
Try to use datediff with a less precise datepart.

必要な精度を実現する 1 つの方法は、反復的に細かい時間コンポーネント (日、時間、分、秒など) に分割し、DateAdd() を使用して値からこれを減算することです。

remainingAtLowerGranularity = DateAdd(granularity, -1 * numFoundInStep, value)
于 2013-10-14T03:59:55.020 に答える
3

2 つの日付の違いを見つけるには、関数DATEDIFFを使用する必要があります

select DATEDIFF(millisecond,'20010105 12:35:15.56786','20010101 23:45:21.12347') 
于 2013-10-14T03:59:51.423 に答える