SQL Serverでは、T-SQL DATEDIFF()
を使用できます。 2つの日付/時刻の差を返す関数。 時間に解決できるすべての式で機能します 、日付 、 smalldatetime 、日時 、 datetime2 、または datetimeoffset 価値。
この記事では、DATEDIFF()
の例を紹介します。 SQLServerで機能します。
構文
まず、構文は次のとおりです。
DATEDIFF ( datepart , startdate , enddate )
datepart 比較したい日付の部分です。 開始日 は最初の日付であり、終了日 は終了日です。
それが機能する方法は、指定された datepart のカウントを(符号付き整数値として)返すことです。 指定された開始日の間で境界を越えました およびenddate 。
例1
2つの日付の間の日数を調べる基本的な例を次に示します。
SELECT DATEDIFF(day, '2001-01-01', '2002-01-01') AS Result;
結果:
+----------+ | Result | |----------| | 365 | +----------+
例2
2つの変数を宣言し、それらに2つの異なる日付を割り当てる別の例を次に示します(DATEADD()
を使用します 最初の日付に1年を追加します)。次に、DATEDIFF()
を使用します その日付のさまざまな日付部分を返すには:
DECLARE @date1 datetime2 = '2000-01-01 00:00:00.0000000'; DECLARE @date2 datetime2 = DATEADD(year, 1, @date1); SELECT DATEDIFF( year, @date1, @date2 ) AS Years, DATEDIFF( quarter, @date1, @date2 ) AS Quarters, DATEDIFF( month, @date1, @date2 ) AS Months, DATEDIFF( week, @date1, @date2 ) AS Weeks, DATEDIFF( dayofyear, @date1, @date2 ) AS DayOfYear, DATEDIFF( day, @date1, @date2 ) AS Days;
結果:
+---------+------------+----------+---------+-------------+--------+ | Years | Quarters | Months | Weeks | DayOfYear | Days | |---------+------------+----------+---------+-------------+--------| | 1 | 4 | 12 | 53 | 366 | 366 | +---------+------------+----------+---------+-------------+--------+
例3
前述のように、日付間の時間部分を返すこともできます。日付/時刻の値の間の時間、分、秒の数を返す例を次に示します。
DECLARE @date1 datetime2 = '2000-01-01 00:00:00.0000000'; DECLARE @date2 datetime2 = DATEADD(hour, 1, @date1); SELECT DATEDIFF( hour, @date1, @date2 ) AS Hours, DATEDIFF( minute, @date1, @date2 ) AS Minutes, DATEDIFF( second, @date1, @date2 ) AS Seconds;
結果:
+---------+-----------+-----------+ | Hours | Minutes | Seconds | |---------+-----------+-----------| | 1 | 60 | 3600 | +---------+-----------+-----------+
例4
次に、2つの日付/時刻値の間のミリ秒、マイクロ秒、およびナノ秒の数を取得する例を示します。
DECLARE @date1 datetime2 = '2000-01-01 00:00:00.0000000'; DECLARE @date2 datetime2 = DATEADD(millisecond, 1, @date1); SELECT DATEDIFF( millisecond, @date1, @date2 ) AS Milliseconds, DATEDIFF( microsecond, @date1, @date2 ) AS Microseconds, DATEDIFF( nanosecond, @date1, @date2 ) AS Nanoseconds;
結果:
+----------------+----------------+---------------+ | Milliseconds | Microseconds | Nanoseconds | |----------------+----------------+---------------| | 1 | 1000 | 1000000 | +----------------+----------------+---------------+
例5–エラー!
100年でナノ秒数を返すなど、極端なことをしようとすると、エラーが発生します。これは、DATEDIFF()
intを返します 値であり、100年で intよりも多くのナノ秒があります データ型は処理できます。
それで、これを行おうとするとどうなりますか:
DECLARE @date1 datetime2 = '2000-01-01 00:00:00.0000000'; DECLARE @date2 datetime2 = DATEADD(year, 100, @date1); SELECT DATEDIFF( millisecond, @date1, @date2 ) AS Milliseconds, DATEDIFF( microsecond, @date1, @date2 ) AS Microseconds, DATEDIFF( nanosecond, @date1, @date2 ) AS Nanoseconds;
結果:
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.
幸い、100年で何ナノ秒かを本当に知る必要がある場合は、DATEDIFF_BIG()
を使用できます。 代わりに機能します。この関数は、署名された bigintを返します DATEDIFF()
よりもはるかに大きな値を返すことができるデータ型 できます。
例6–奇妙な結果を得る?
DATEDIFF()
から得られる結果 関数が実際にどのように機能するかわからない場合、完全に間違って見えることがあります。
例:
DECLARE @startdate datetime2 = '2016-01-01 00:00:00.0000000', @enddate datetime2 = '2016-12-31 23:59:59.9999999'; SELECT DATEDIFF(day, @startdate, @enddate) Days, DATEDIFF(year, @startdate, @enddate) Years;
結果:
+--------+---------+ | Days | Years | |--------+---------| | 365 | 0 | +--------+---------+
DATEDIFF()
の方法がわからない場合 実際には機能しますが、この結果は非常に間違っているように見える可能性があるため、バグであると想定することは許されます。しかし、それはバグではありません。
DATEDIFF()がSQL Serverで間違った結果を返すのを確認してください?これを読む。この例と、結果が完全に間違っているように見えるが完全に正しい他のケースを確認するために(そして、なぜそれらがそのように見えるのかについての説明のために)
そのページの例の1つは、おそらくここでもう一度言及する価値があります。 DATEDIFF()
実際にはSET DATEFIRST
を無視します 価値。これにより、特に日曜日を週の最初の日として使用しない文化にいる場合は、予期しない結果が生じる可能性があります。影響を受ける可能性があると思われる場合は、SQLServerでSETDATEFIRSTを無視するDATEDIFF()のこの回避策を確認してください。