SQL Serverでは、DATEDIFF_BIG()
を使用できます。 DATEDIFF()
の代わりに関数 戻り値が非常に大きいと予想される場合は関数。たとえば、1000年のミリ秒数を調べようとすると、エラーが発生します。
これは、DATEDIFF()
intを返します データ型であり、結果が大きすぎてそのデータ型で処理できません。一方、DATEDIFF_BIG()
関数は署名されたbigintを返します データ型。これを使用して、はるかに大きな値を返すことができます。つまり、はるかに広い範囲の日付で使用できます。
それ以外は、2つの機能に実際の違いはありません。
この記事では、DATEDIFF_BIG()
の使用例を紹介しています。 SQLServerで機能します。
構文
まず、構文は次のとおりです。
DATEDIFF_BIG ( datepart , startdate , enddate )
datepart 比較したい日付の部分です。 開始日 は最初の日付であり、終了日 は終了日です。
この関数はstartdateを減算します 終了日から 。
それが機能する方法は、指定された datepart のカウントを(符号付きの大きな整数値として)返すことです。 指定された開始日の間で境界を越えました およびenddate 。
これは、DATEDIFF()
で使用される構文とまったく同じです。 機能。
例1
これは、それがどのように機能するかを示すための基本的な例です。
SELECT DATEDIFF_BIG(day, '0001-01-01', '9002-01-01') AS Result;
結果:
+----------+ | Result | |----------| | 3287547 | +----------+
この場合、DATEDIFF()
を使用できた可能性があることに注意してください 、結果は整数に対して大きすぎないため。
例2
これは、2つの日付からのさまざまな日付部分の差を返す例です。この場合、2つの変数を宣言し、それらに2つの異なる日付を割り当てます(DATEADD()
を使用します 最初のデートに1000年を追加する関数):
DECLARE @date1 datetime2 = '2000-01-01 00:00:00.0000000'; DECLARE @date2 datetime2 = DATEADD(year, 1000, @date1); SELECT DATEDIFF_BIG( year, @date1, @date2 ) AS Years, DATEDIFF_BIG( quarter, @date1, @date2 ) AS Quarters, DATEDIFF_BIG( month, @date1, @date2 ) AS Months, DATEDIFF_BIG( week, @date1, @date2 ) AS Weeks, DATEDIFF_BIG( dayofyear, @date1, @date2 ) AS DayOfYear, DATEDIFF_BIG( day, @date1, @date2 ) AS Days;
結果:
+---------+------------+----------+---------+-------------+--------+ | Years | Quarters | Months | Weeks | DayOfYear | Days | |---------+------------+----------+---------+-------------+--------| | 1000 | 4000 | 12000 | 52178 | 365243 | 365243 | +---------+------------+----------+---------+-------------+--------+
ここでも、DATEDIFF()
を使用できます。 、結果が整数に対して大きすぎることはないためです。
例3
この例では、2つの日付の間の時間、分、秒を返します。
DECLARE @date1 datetime2 = '2000-01-01 00:00:00.0000000'; DECLARE @date2 datetime2 = DATEADD(year, 1000, @date1); SELECT DATEDIFF_BIG( hour, @date1, @date2 ) AS Hours, DATEDIFF_BIG( minute, @date1, @date2 ) AS Minutes, DATEDIFF_BIG( second, @date1, @date2 ) AS Seconds;
結果:
+---------+-----------+-------------+ | Hours | Minutes | Seconds | |---------+-----------+-------------| | 8765832 | 525949920 | 31556995200 | +---------+-----------+-------------+
これで、DATEDIFF()
エラーが返されます。 intには秒数が大きすぎます (ただし、 bigintの場合は対象外です 。
例4
最後に、ミリ秒、マイクロ秒、ナノ秒の例を次に示します。
DECLARE @date1 datetime2 = '2000-01-01 00:00:00.0000000'; DECLARE @date2 datetime2 = DATEADD(year, 100, @date1); SELECT DATEDIFF_BIG( millisecond, @date1, @date2 ) AS Milliseconds, DATEDIFF_BIG( microsecond, @date1, @date2 ) AS Microseconds, DATEDIFF_BIG( nanosecond, @date1, @date2 ) AS Nanoseconds;
結果:
+----------------+------------------+---------------------+ | Milliseconds | Microseconds | Nanoseconds | |----------------+------------------+---------------------| | 3155760000000 | 3155760000000000 | 3155760000000000000 | +----------------+------------------+---------------------+
この場合、DATEDIFF_BIG()
のメリットがはっきりとわかります。 DATEDIFF()
を超えています 。 DATEDIFF()
3つすべてで倒れていたでしょう。