SQL Serverで2つの日付の違いを見つける必要がある場合は、DATEDIFF()
を使用した可能性があります。 働き。この関数は、 datepartを使用して2つの日付間の時間を返します あなたが指定します。たとえば、日付1から日付2までの日数を返すために使用できます。また、分、秒、月、年などの数を返すように取得することもできます。
DATEDIFF_BIG()
関数はまったく同じように機能しますが、微妙な違いが1つあります。それは戻りデータ型です。
したがって、これら2つの関数の違いは、戻り値のデータ型です。
-
DATEDIFF()
符号付き整数( int )を返します ) -
DATEDIFF_BIG()
符号付きの大きな整数を返します( bigint )
場合によっては、 bigintを返す必要があまりないこともあります。 データ・タイプ。これは非常に大きな数であり、DATEDIFF()
を使用するかどうかを表します またはDATEDIFF_BIG()
違いはありません(ストレージ要件を除く– int 4バイトを使用、 bigint 8バイトを使用します。
ただし、次のエラーが発生した場合:
datediff関数がオーバーフローを引き起こしました。 2つの日付/時刻インスタンスを区切る日付部分の数が多すぎます。精度の低い日付部分でdatediffを使用してみてください。
戻り値が大きすぎるためです。
この場合、次の3つのいずれかを行う必要があります。
- より短い期間を使用します。たとえば、26日間のミリ秒数を返す代わりに、25を試してください。
- 精度の低いdatepartを使用する 。たとえば、ミリ秒数を返すのではなく、ほんの数秒で返します。
-
DATEDIFF_BIG()
を使用します 代わりに機能します。
最初の2つのオプションが適切でない場合があります。 26日間の期間が必要な場合、25はそれを短縮するつもりはありません。また、2038年以降のUnixタイムスタンプが必要な場合、DATEDIFF()
を使用すると、2038年問題が発生します。 。
いずれにせよ、DATEDIFF_BIG()
関数を使用すると、DATEDIFF()
よりもはるかに広い範囲の結果が得られます。 。
例
DATEDIFF()
の類似点と相違点の両方を示す2つの例を次に示します。 およびDATEDIFF_BIG()
。
同じ結果
両方の関数が同じ結果を生成する例を次に示します。
DECLARE @date1 datetime2 = SYSDATETIME(); DECLARE @date2 datetime2 = DATEADD(second, 1, SYSDATETIME()); SELECT DATEDIFF( millisecond, @date1, @date2 ) AS DATEDIFF, DATEDIFF_BIG( millisecond, @date1, @date2 ) AS DATEDIFF_BIG;
結果:
DATEDIFF DATEDIFF_BIG -------- ------------ 1000 1000
予想どおり、両方の関数は同じ結果を返します。これは、戻り値が bigintの両方に対応できるほど小さいためです。 およびint データ型。 1秒間にミリ秒数を返すだけでした。
異なる結果
さて、期間を1000年に延長するとどうなりますか。
まず、DATEDIFF()
を使用するとどうなりますか。 :
DECLARE @date1 datetime2 = SYSDATETIME(); DECLARE @date2 datetime2 = DATEADD(year, 1000, SYSDATETIME()); SELECT DATEDIFF( millisecond, @date1, @date2 ) AS DATEDIFF;
結果:
Error: 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.
さて、これがDATEDIFF_BIG()
の方法です 処理:
DECLARE @date1 datetime2 = SYSDATETIME(); DECLARE @date2 datetime2 = DATEADD(year, 1000, SYSDATETIME()); SELECT DATEDIFF_BIG( millisecond, @date1, @date2 ) AS DATEDIFF_BIG;
結果:
DATEDIFF_BIG -------------- 31556908800000
int には、1000年のミリ秒数を返すのは多すぎました 、ただし、 bigintの場合は問題ありません 。