Skip to main content

This documentation is for an older version of this product. See the latest version of this content.Opens in a new tab

DATEDIFF (SQL)

2 つの日付の間に指定された datepart のために整数の差を返す、日付/時刻関数です。

Synopsis

DATEDIFF(datePart,startDate,endDate)

説明

  • DATEDIFF(datePart,startDate,endDate) は、指定された日付部分 (秒、日、週など) に開始日と終了日の差である INTEGER 値 (startDate - endDate) を返します。endDatestartDate より前の場合、DATEDIFF は負の INTEGER 値を返します。

    以下の文では、2 つのタイムスタンプ間に 353 日の差 (D) があるので 353 を返します。

    SELECT DATEDIFF(D,'2022-01-01 00:00:00','2022-12-20 12:00:00')

    例 : 日付間の差異の計算

DATEDIFF は、Sybase および Microsoft SQL Server と互換性があります。TIMESTAMPDIFF ODBC スカラ関数を使用して、同様に時刻と日付の比較を実行できます。

引数

datePart

日付または時刻の部分の名前または省略名です。datePart は大文字でも小文字でも指定できます。埋め込み SQL では、datePart をリテラル値またはホスト変数で指定します。有効な日付と時刻の部分を以下の表に示します。

名前 省略形
year yyyyyy
month mmm
week wkww
weekday dw
day ddd
dayofyear dy
hour hh
minute min
second sss
millisecond ms
microsecond mcs
nanosecond ns

日付部分の weekdaydayofyear の値は day の値と機能的に同一です。

DATEDIFF では、四半期 (3 か月の期間) は処理されません。

開始日と終了日に秒の小数部も指定すると、DATEDIFF から秒の小数部の差が整数として返されます。以下に例を示します。

SELECT DATEDIFF('ms','64701,56670.10','64701,56670.27'),     /* returns 170 */
       DATEDIFF('ms','64701,56670.1111','64701,56670.27222') /* returns 161 */

DATEDIFF からは、startDateendDate の小数桁数の精度に関係なく、秒の小数部がミリ秒 (3 桁の整数)、マイクロ秒 (6 桁の整数)、またはナノ秒 (9 桁の整数) として返されます。以下に例を示します。

DATEDIFF の動作は、datePart の指定で引用符を使用しているかどうかによってわずかに異なります。

  • 引用符を使用している場合 : DATEDIFF('month','2018-02-25',$HOROLOG)datePart がリテラルとして扱われます。クエリを処理するときにリテラル置換が実行され、文字列 'month' が入力パラメータに置き換えられます。これにより、より一般的に使用できるクエリ・キャッシュが生成されます。

  • 引用符を使用していない場合 : DATEDIFF(month,'2018-02-25',$HOROLOG)datePart がキーワードとして扱われます。クエリの処理ではリテラル置換が実行されません。これにより、固有性が高いクエリ・キャッシュが生成されます。

埋め込み SQL では、入力変数として無効な datePart を指定すると、SQLCODE -8 エラーが返されます。無効な datePart をリテラル値として指定すると、<SYNTAX> エラーが返されます。

ダイナミック SQL では、無効な datepart を指定すると、DATEDIFF から NULL が返されます。SQLCODE エラーは発行されません。

startDate、endDate

DATEDIFF で差異の計算対象とする開始日付と終了日付。InterSystems IRIS® の以下のデータ型のいずれかとして指定します。

  • %Date 論理値 (+$H)。$HOROLOG 形式とも呼ばれます。

  • %PosixTime (%Library.PosixTimeOpens in a new tab) 論理値 (エンコードされた 64 ビットの符号付き整数)。

  • %TimeStamp (%Library.TimeStampOpens in a new tab) 論理値 (YYYY-MM-DD HH:MM:SS.FFF)。ODBC 形式とも呼ばれます。

  • %String または文字列互換の値。以下のいずれかの形式とします。

    $HOROLOG の日付と時刻の形式
    形式
    ddddd SELECT DATEDIFF('yy','65726','66716')
    ddddd,sssss SELECT DATEDIFF('mi','65726,143','66716,256')
    ddddd,sssss.fff SELECT DATEDIFF('ns','65726,143.345','66716,256.467')

    各要素の内容は以下のとおりです。

    • ddddd : 1840 年 12 月 31 日からの経過日数 (整数値)。

    • sssss : 指定日の開始からの経過秒数 (整数値)。

    • fff : 秒の小数部 (整数値)。

    日付形式
    形式
    MM/DD/YY SELECT DATEDIFF('yy','11/25/80','12/31/99')
    MM/DD/YYYY SELECT DATEDIFF('dd','3/15/2017','8/24/2022')
    MM-DD-YY SELECT DATEDIFF('yy','11-25-80','12-31-99')
    MM-DD-YYYY SELECT DATEDIFF('dd','3-15-2017','8-24-2022')
    MM.DD.YY SELECT DATEDIFF('yy','11.25.80','12.31.99')
    MM.DD.YYYY SELECT DATEDIFF('dd','3.15.2017','8.24.2022')
    Mmm DD YY SELECT DATEDIFF('ss','Sep 9 91','Dec 30 92')
    Mmm DD YYYY SELECT DATEDIFF('ss','October 10 2019','January 23 2021')
    Mmm DD, YY SELECT DATEDIFF('ss','Sep 9, 91','Dec 30, 92')
    Mmm DD, YYYY SELECT DATEDIFF('ss','October 10, 2019','January 23, 2021')

    各要素の内容は以下のとおりです。

    • MM : 2 桁の月。

    • DD : 月の 2 桁の日数。

    • Mmm : スペルアウト表記の月名。最低 3 文字 (例 : Mar) から完全な月名 (例 : March) まで指定できます。

    • YY は 2 桁形式、YYYY は 4 桁形式の年です。

    startDate および endDate は日付と時刻の文字列を組み合わせて指定できます。以下に例を示します。

    SELECT DATEDIFF('hh','12/22/2021 8:15:23','12/31/2021 10:30:23')

    日付を指定せずに時刻を指定すると、DATEDIFF では既定で日付が 01/01/1900 になりす。

    時刻形式
    形式
    HH: SELECT DATEDIFF('hh','2:','10:')
    HH:MM SELECT DATEDIFF('mi','2:15','10:30')
    HH:MM:SS SELECT DATEDIFF('ss','2:15:23','10:30:59')
    HH...SS:FFF SELECT DATEDIFF('ms','2:15:23:335','10:30:59:245')
    HH...SS.FFF SELECT DATEDIFF('ms','2:15:23.335','10:30:59.245')
    HH...[AM|PM] SELECT DATEDIFF('mi','2:15AM','10:30PM')

    各要素の内容は以下のとおりです。

    • HH : 1 日での 2 桁の時間値。

    • MM : 1 時間での 2 桁の分の値。

    • SS : 1 分間での 2 桁の秒の値。

    • FFF : 秒の小数部の値。

    startDate および endDate は日付と時刻の文字列を組み合わせて指定できます。以下に例を示します。

    SELECT DATEDIFF('hh','12/22/2021 8:15:23','12/31/2021 10:30:23')

    時刻を指定せずに日付を指定すると、DATEDIFF では既定で時刻が 00:00:00 になります。

startDate 引数と endDate 引数は異なるデータ型で指定できます。

startDate 引数と endDate 引数の制限事項と動作は以下のとおりです。

  • 日付文字列は完全であると同時に、要素数、各要素の桁数、および区切り文字に適切な形式が使用されている必要があります。年は 4 桁で指定される必要があります。入力値の日付部分を省略すると、DATEDIFF では既定で日付が '1900-01-01' になります。

  • 日付と時刻の値は、以下の有効な範囲内にあることが必要です。

    • 年 — 0001 から 9999

    • 月 — 1 から 12

    • 日 — 1 から 31

    • 時間 — 00 から 23

    • 分 — 0 から 59

    • 秒 — 0 から 59

    月の日数は、該当月と該当年に合ったものでなければなりません。例えば、日付 '02-29' が有効なのは、指定された年がうるう年の場合のみです。無効な日付値を指定すると、SQLCODE -8 エラーになります。

  • 10 (月および日) 未満の日付値では、先頭のゼロを省略してもかまいません。その他の非標準的な整数値は許可されません。例えば、Day の値として '07''7' は有効ですが、'007''7.0''7a' は無効です。

  • 時刻値は省略してもかまいません。startDate または endDate に不完全な時刻を指定すると、指定していない部分には 0 が使用されます。

  • 10 よりも小さい時間値の先頭の 0 は記載する必要があります。この先頭の 0 を省略すると、SQLCODE -8 エラーになります。

  • 埋め込み SQL では、入力変数またはリテラルとして無効な startDate または endDate を指定すると、SQLCODE -8 エラーが返されます。

  • ダイナミック SQL では、無効な startDate または endDate を指定すると、DATEDIFF から NULL が返されます。SQLCODE エラーは発行されません。

  • 01 から 99 までの 2 桁の年は 1901 年から 1999 年までと見なされます。例えば、以下の文の startDate の年は 1914 年です。

    SELECT DATEDIFF('year','10/11/14','04/22/2022'),
           DATEDIFF('year','12:00:00','2022-04-22 12:00:00')

    00 は 0000 年と見なされます。これは無効であり、エラーが返されます。

    この日付をシステム全体で制御する既定のスライディング・ウィンドウを変更するには、%DATE ユーティリティを使用します。その方法は、https://docs.intersystems.com/priordocexcerptsOpens in a new tab の旧ドキュメントを参照してください。2 桁の年で指定した日付を解釈するためのスライディング・ウィンドウの設定については、$ZDATE$ZDATEH$ZDATETIME、および $ZDATETIMEH の各関数の説明を参照してください。

日付間の差異の計算

DATEDIFF は、startDateendDate の間の合計日数を指定の単位で返します。例えば、以下の文は日付間の差を分数で計算します。また、日付と時刻の両方のコンポーネントが評価されます。1 日の差ごとに、1 日の分数である 1440 分が加算されます。

SELECT DATEDIFF('mi','1910-08-21 08:32:04','1910-08-28 01:45:00')

DATEDIFF では、日付間の実際の期間が考慮されません。startDateendDate の間に存在する指定の日付部分境界の数と見なされることがあります。例えば、連続する年の間のこうした差異すべてで、その期間が 365 日を超えていても 365 日未満であっても、DATEDIFF として 1 が返されます。

SELECT DATEDIFF('yyyy','1910-08-21','1911-08-21') AS ExactYear,
       DATEDIFF('yyyy','1910-06-30','1911-01-01') AS HalfYear,
       DATEDIFF('yyyy','1910-01-01','1911-12-31') AS Nearly2Years,
       DATEDIFF('yyyy','1910-12-31 11:59:59','1911-01-01 00:00:00') AS NewYearSecond

同様に、以下の文では、2 つの値の間で実際の期間はわずか 6 秒ですが、連続する分の差異は 1 となります。

SELECT DATEDIFF('mi','12:23:59','12:24:05') AS MinuteDiff

ここまでの文では日付部分に省略形を使用しましたが、完全名を指定することもできます。以下に例を示します。

SELECT DATEDIFF('minute','12:23:59','12:24:05') AS MinuteDiff

以下の埋め込み SQL の例では、ホスト変数を使用して、前述の文と同じ DATEDIFF 処理を実行します。

  set datePart="minute"
  set startDate="12:23:59"
  set endDate="12:24:05"

  &sql(SELECT DATEDIFF(:datePart,:startDate,:endDate) INTO :diff)
  WRITE diff, !

以下の文は、WHERE 節で DATEDIFF を使用して、先週入院した患者を選択します。

SELECT Name,DateOfAdmission FROM Sample.Patients WHERE DATEDIFF(D,DateOfAdmission,$HOROLOG) <= 7

以下の文は、サブクエリを使用して、生年月日が現在の日付から 1500 日以内の人のレコードを返します。

SELECT Name,Age,DOB
FROM (SELECT Name,Age,DOB, DATEDIFF('dy',DOB,$HOROLOG) AS DaysTo FROM Sample.Person)
WHERE DaysTo <= 1500
ORDER BY Age

時刻形式に依存しない時刻の差

DATEDIFF は、秒数が返されないように現在のプロセスの時刻形式を設定していても、秒単位とミリ秒単位で時刻の差を返します。以下に例を示します。

  // Get current time format and set start and end times
  set originalTimeFormat = ##class(%SYS.NLS.Format).GetFormatItem("TimeFormat")
  set startDate = "66211,34717.10"
  set endDate = "66211,34720.27"

  // Set time format that includes seconds (TimeFormat = 1)
  do ##class(%SYS.NLS.Format).SetFormatItem("TimeFormat",1)
  write "DATETIME (with seconds): ",!, $ZDATETIME(startDate,1,-1),"  ",$ZDATETIME(endDate,1,-1),!  
  &sql(SELECT DATEDIFF('ss',:startDate,:endDate) INTO :diff)
  write "DATEDIFF number of seconds: ",diff,!!
  
  // Set time format that omits seconds (TimeFormat = 2)
  do ##class(%SYS.NLS.Format).SetFormatItem("TimeFormat",2)
  write "DATETIME (without seconds): ",!, $ZDATETIME(startDate,1,-1),"  ",$ZDATETIME(endDate,1,-1),!
  &sql(SELECT DATEDIFF('ss',:startDate,:endDate) INTO :diff)
  write "DATEDIFF number of seconds: ",diff,!
  
  // Revert to original time format
  do ##class(%SYS.NLS.Format).SetFormatItem("TimeFormat",originalTimeFormat)

別の方法

ObjectScript コードでこの関数を呼び出すには、DATEDIFF()Opens in a new tab メソッドを使用します。

$SYSTEM.SQL.Functions.DATEDIFF(datePart,startDate,endDate)

無効な datepartDATEDIFF() メソッドに指定すると、<ZDDIF> エラーが発生します。

関連項目

FeedbackOpens in a new tab