DATEADD
Synopsis
DATEADD(datepart,integer-exp,date-exp)
引数
datepart | 日付または時刻部分の名前 (または省略形)。この名前は大文字でも小文字でも指定できます。引用符で囲んでも囲まなくてもかまいません。datepart はリテラルまたはホスト関数として指定できます。 |
integer-exp | すべての数値タイプの数値式。値は、整数 (正または負) に切り捨てられます。この値は datepart 単位の数を表し、date-exp に加算または減算されます。 |
date-exp | 変更される日付/時刻式。これには、日付文字列、タイムスタンプ文字列、または CURRENT_DATE などの関数を指定できます。返される値は、常に %TimeStamp データ型形式のタイムスタンプです。 |
概要
DATEADD 関数は、指定された日付部分を指定された単位数でインクリメントすることで、日付/時刻式を変更します。例えば、datepart が 'month' で、integer-exp が 5 の場合は、DATEADD は date-exp に 5 か月をインクリメントします。また、integer-exp に負の整数を指定して、日付部分をデクリメントすることもできます。
計算された日付は、完全な日付/時刻式 (タイムスタンプ) として返されます。DATEADD はデータ型 %Library.TimeStampOpens in a new tab (yyyy-mm-dd hh:mm:ss.fff) を返します。
DATEADD は、各月の日数やうるう年を考慮に入れて、常に有効な日付を返します。例えば、1 月 31 日に 1 か月をインクリメントすると 2 月 28 日 (該当月の有効な最終日付) が返されますが、指定された年がうるう年の場合は 2 月 29 日が返されます。うるう年の 2 月 29 日に 1 年をインクリメントすると 2 月 28 日が返されます。うるう年の 2 月 29 日に 4 年をインクリメントすると 2 月 29 日が返されます。
秒の小数部を含む date-exp を指定した場合は、返り値にも秒の小数部が含まれます。date-exp の時刻部分を省略した場合、DATEADD は既定時刻の 00:00:00 を返します。date-exp の日付部分を省略した場合、DATEADD は既定日付の 1900–01–01 を返します。
DATEADD と TIMESTAMPADD では四半期 (3 か月の間隔) が処理されます。DATEDIFF と TIMESTAMPDIFF では四半期は処理されません。
同様の日付/時刻変更の演算は、TIMESTAMPADD ODBC スカラ関数を使用して実行できます。
この関数は、ObjectScript から DATEADD()Opens in a new tab メソッド呼び出しを使用して呼び出すこともできます。
$SYSTEM.SQL.DATEADD(datepart,integer-exp,date-exp)
Datepart 引数
datepart 引数は、以下の日付/時刻コンポーネントの 1 つで、正式な名前 (日付部分列) または省略形 (省略形列) のいずれかになります。これらの datepart コンポーネント名と省略形では、大文字と小文字は区別されません。
日付部分 | 省略形 | integer-exp が 1 の場合 |
---|---|---|
year | yyyy, yy | 年に 1 をインクリメント。 |
quarter | qq, q | 月に 3 をインクリメント。 |
month | mm, m | 月に 1 をインクリメント。 |
week | wk, ww | 日に 7 をインクリメント。 |
weekday | dw | 日に 1 をインクリメント。 |
day | dd, d | 日に 1 をインクリメント。 |
dayofyear | dy, y | 日に 1 をインクリメント。 |
hour | hh | 時間に 1 をインクリメント。 |
minute | mi, n | 分に 1 をインクリメント。 |
second | ss, s | 秒に 1 をインクリメント。 |
millisecond | ms | 0.001 秒をインクリメント。 |
日付部分をインクリメントまたはデクリメントすると、他の日付部分も適切に変更されます。例えば、時間のインクリメント結果が午前 0 時を超える場合、自動的に日がインクリメントされます。同様に、順次、月などがインクリメントされます。
datepart は、引用符付き文字列として、または引用符なしで指定できます。以下のように構文に変化があると、実行される操作も少し異なります。
-
引用符あり:DATEADD('month',12,$HOROLOG):datepart は、クエリ・キャッシュの作成時にリテラルとして扱われます。Caché SQL は、リテラル置換を実行します。これにより、より一般的で再利用可能なクエリ・キャッシュが生成されます。
-
引用符なし:DATEADD(month,12,$HOROLOG):datepart は、クエリ・キャッシュの作成時にキーワードとして扱われます。リテラル置換はありません。これにより、より特化したクエリ・キャッシュが生成されます。
リテラルとして無効な datepart 値を指定した場合は、SQLCODE -8 エラー・コードが発行されます。一方、ホスト変数として無効な datepart 値を指定した場合は、SQLCODE エラーは発行されず、DATEPART 関数は NULL 値を返します。
日付式の形式
date-exp 引数は、以下のいずれかの形式で指定できます。秒の小数部は指定しても省略してもかまいません。
-
Caché %Date 論理値 (+$H)
-
Caché %TimeStamp (%Library.TimeStampOpens in a new tab) 論理値 (YYYY-MM-DD HH:MM:SS)
-
Caché %String (互換性のある) 値
Caché %String (互換性のある) 値は、以下のいずれかの形式になります。
-
99999,99999 ($H 形式)
-
Sybase/SQL-Server-dateSybase/SQL-Server-time
-
Sybase/SQL-Server-timeSybase/SQL-Server-date
-
Sybase/SQL-Server-date (既定時刻は 00:00:00)
-
Sybase/SQL-Server-time (既定日付は 01/01/1900)
Sybase/SQL-Server-date は、以下の 5 形式のいずれかです。
mmdelimiterdddelimiter[yy]yy dd Mmm[mm][,][yy]yy dd [yy]yy Mmm[mm] yyyy Mmm[mm] dd yyyy [dd] Mmm[mm]
delimiter は、スラッシュ (/)、ハイフン (-)、またはピリオド (.) です。
Sybase/SQL-Server-time は、以下の 3 形式のいずれかです。
HH:MM[:SS:SSS][{AM|PM}] HH:MM[:SS.S] HH['']{AM|PM}
年が 2 桁で表示される場合、Caché はスライディング・ウィンドウを確認して日付を解釈します。スライディング・ウィンドウのシステムの既定は、%DATE ユーティリティで設定できます。これは、“InterSystems のドキュメントの使用法” の “旧ドキュメント” の章でのみ説明されています。現在のプロセスのスライディング・ウィンドウの設定の詳細は、ObjectScript の $ZDATE、$ZDATEH、$ZDATETIME、および $ZDATETIMEH の各関数のドキュメントを参照してください。
DATEADD では、Sybase および Microsoft SQL Server との互換性が提供されています。
範囲と値のチェック
DATEADD は、入力値に対して以下のチェックを実行します。値がチェックに失敗した場合は、NULL 文字列が返されます。
-
日付文字列は完全であると同時に、要素数、各要素の桁数、および区切り文字に適切な形式が使用されている必要があります。年は 4 桁で指定される必要があります。
-
日付値は、有効な範囲内にある必要があります。年は 1841 から 9999、月は 1 から 12、日は 1 から 31、時間は 0 から 23、分は 0 から 59、秒は 0 から 59 がそれぞれ有効範囲です。
-
インクリメント結果として返される年は、1841 から 9999 までの範囲内にある必要があります。この範囲を超えると、<null> が返されます。
-
月の日数は、該当月と該当年に合ったものでなければなりません。例えば、日付 '02–29' が有効なのは、指定された年がうるう年の場合のみです。
-
10 よりも小さい日付値の先頭のゼロは、記載、省略のどちらでもかまいません。その他の非標準的な整数値は許可されません。例えば、'07' または '7' は有効な日値ですが、'007'、'7.0'、または '7a' は無効です。
例
以下の例は、指定された日付に 1 週を加算します。
SELECT DATEADD('week',1,'1999-12-20') AS NewDate
1 週の加算は 7 日の加算になるので、上記の例は 1999-12-27 00:00:00 を返します。この DATEADD では、時刻部分が省略されています。
以下の例は、元のタイムスタンプに 5 か月を加算します。
SELECT DATEADD(MM,5,'1999-12-20 12:00:00') AS NewDate
5 か月を加算すると年がインクリメントされるので、上記の例は 2000-05-20 12:00:00 を返します。
以下の例も、元のタイムスタンプに 5 か月を加算します。
SELECT DATEADD('mm',5,'1999-01-31 12:00:00') AS NewDate
上記の例は 1999-06-30 12:00:00 を返します。この DATEADD は、月だけでなく日の値も変更します。これは単純に月をインクリメントすると、無効な日付の 6 月 31 日となるためです。
以下の例は、元のタイムスタンプに 45 分を加算します。
SELECT DATEADD(MI,45,'1999-12-20 12:00:00') AS NewTime
上記の例は 1999-12-20 12:45:00 を返します。
以下の例も、元のタイムスタンプに 45 分を加算しますが、この場合は日付もインクリメントされます。
SELECT DATEADD('mi',45,'1999-12-20 23:30:00') AS NewTime
上記の例は 1999-12-21 00:15:00 を返します。
以下の例は、元のタイムスタンプに 45 分をデクリメントします。
SELECT DATEADD(N,-45,'1999-12-20 12:00:00') AS NewTime
上記の例は 1999-12-20 11:15:00 を返します。
以下の例は、現在の日付に 60 日を加算し、結果を各月の長さに合わせて調整します。
SELECT DATEADD(D,60,CURRENT_DATE) AS NewDate
以下の例では、最初の DATEADD は指定日付に 92 日を、2 つ目の DATEADD は指定日付に 3 カ月を加えます。
SELECT DATEADD('dd',92,'1999-12-20') AS NewDateD,
DATEADD('qq',1,'1999-12-20') AS NewDateQ
最初の例は 2000-03-21 00:00:00 を返し、2 番目の例は 2000-03-20 00:00:00 を返します。1 四半期をインクリメントすると、月部分に 3 がインクリメントされ、必要に応じて年部分がインクリメントされます。また、結果月の最大日数に合わせて修正されます。
上記の例は、すべて datepart に省略形を使用しています。しかし、datepart には、以下の例のように正式な名前を指定することもできます。
SELECT DATEADD('day',92,'1999-12-20') AS NewDate
上記の例は 2000-03-21 00:00:00 を返します。
以下の埋め込み SQL の例では、ホスト変数を使用して前述の例と同じ DATEADD 処理を実行しています。
SET x="day"
SET datein="1999-12-20"
&sql(SELECT DATEADD(:x,92,:datein)
INTO :dateout)
WRITE "in: ",datein,!,"out: ",dateout
関連項目
-
DATEDIFF 関数
-
DATENAME 関数
-
DATEPART 関数
-
TIMESTAMPADD 関数