WEEK (SQL)
構文
{fn WEEK(date-expression)}
概要
WEEK は、date-expression を受け取り、その日付に対するその年の初めからの週の数を返します。
既定では、週は $HOROLOG 日付 (1840 年 12 月 31 日からの日数を表す正または負の整数) を使用して計算されます。したがって、週は年と年をまたいでカウントされ、Week 1 は前年の最後の週から開始された 7 日間を終了した週となります。週は常に日曜日から始まり、したがって、暦年の最初の日曜日は、Week 1 から Week 2 への切り替えを意味します。その年の最初の日曜日が 1 月 1 日である場合、その日曜日は Week 1 になります。その年の最初の日曜日が 1 月 1 日より後の場合、その日曜日は Week 2 の第 1 日目になります。このため、Week 1 は、一般的には、7 日間より短くなります。DAYOFWEEK 関数を使用すると、週の曜日を決定できます。1 年の週の合計数は、一般的に 53 です。うるう年には 54 になります。
InterSystems IRIS では、1 年の週の決定について ISO 8601 規格もサポートしています。この規格は、主にヨーロッパの国で使用されます。InterSystems IRIS が ISO 8601 用に構成されている場合、WEEK は週を月曜日からカウントし、週はその週の木曜日が含まれる年に割り当てられます。例えば、2004 年の Week 1 は、週の木曜日が 2004 年 1 月 1 日で 2004 年最初の木曜日であるため、2003 年 12 月 29 日の月曜日から 2004 年 1 月 4 日の日曜日までです。2005 年の Week 1 は、木曜日が 2005 年 1 月 6 日で 2005 年最初の木曜日であるため、2005 年 1 月 3 日から 2005 年 1 月 9 日までになります。1 年の合計週数は、通常は 52 ですが 53 のこともあります。ISO 8601 のカウントを有効にするには、SET ^%SYS("sql","sys","week ISO8601")=1 とします。
date-expression には、InterSystems IRIS 日付整数、$HOROLOG 値や $ZTIMESTAMP 値、ODBC 形式の日付文字列、またはタイムスタンプを指定できます。
date-expression タイムスタンプには、データ型 %Library.PosixTimeOpens in a new tab (エンコードされた 64 ビットの符号付き整数) またはデータ型 %Library.TimeStampOpens in a new tab (yyyy-mm-dd hh:mm:ss.fff) のいずれかを指定できます。
タイムスタンプの時刻部分は評価されないので省略可能です。
DATEPART または DATENAME 関数を使用しても、DAYOFWEEK と同じ週情報が返されます。
この関数は、ObjectScript から WEEK()Opens in a new tab メソッド・コールを使用して呼び出すこともできます。
$SYSTEM.SQL.Functions.WEEK(date-expression)
日付の検証
WEEK は、入力値に対して以下のチェックを実行します。値がチェックに失敗した場合は、NULL 文字列が返されます。
-
日付文字列は完全であると同時に、要素数、各要素の桁数、および区切り文字に適切な形式が使用されている必要があります。年は 4 桁で指定される必要があります。
-
日付値は、有効な範囲内にある必要があります。年は 0001 から 9999、月は 1 から 12、日は 1 から 31、
-
月の日数は、該当月と該当年に合ったものでなければなりません。例えば、日付 '02-29' が有効なのは、指定された年がうるう年の場合のみです。
-
10 よりも小さい日付値の先頭のゼロは、記載、省略のどちらでもかまいません。その他の非標準的な整数値は許可されません。例えば、'07' または '7' は有効な日値ですが、'007'、'7.0'、または '7a' は無効です。
引数
date-expression
列の名前や、他のスカラ関数の結果、または日付やタイムスタンプ・リテラルである式。
例
以下の例は、2005 年 1 月 2 日 (日曜日) と 2006 年 1 月 1 日 (日曜日) の週の曜日と通算週を返します。
SELECT {fn DAYOFWEEK("2005-1-2")},{fn WEEK("2005-1-2")},
{fn DAYOFWEEK("2006-1-1")},{fn WEEK("2006-1-1")}
以下の例は、与えられた日付が 2004 年の第 9 週目にあたるので、9 を返します。
SELECT {fn WEEK('2004-02-25')} AS Wk_Date,
{fn WEEK('2004-02-25 08:35:22')} AS Wk_Tstamp,
{fn WEEK(59590)} AS Wk_DInt
以下の例は、54 を返します。これは、この例のすぐ後に続く例で示されているように、この特定の日付が 2 日目に開始する Week 2 で始まるうるう年にあるためです。
SELECT {fn WEEK('2000-12-31')} AS Week
SELECT {fn WEEK('2000-01-01')}||{fn DAYNAME('2000-01-01')} AS WeekofDay1,
{fn WEEK('2000-01-02')}||{fn DAYNAME('2000-01-02')} AS WeekofDay2
以下の例はすべて、現在の週を返します。
SELECT {fn WEEK({fn NOW()})} AS Wk_Now,
{fn WEEK(CURRENT_DATE)} AS Wk_CurrD,
{fn WEEK(CURRENT_TIMESTAMP)} AS Wk_CurrTS,
{fn WEEK($HOROLOG)} AS Wk_Horolog,
{fn WEEK($ZTIMESTAMP)} AS Wk_ZTS
以下の埋め込み SQL の例は、InterSystems IRIS の既定の年における週と、ISO 8601 規格が適用された年における週を示しています。
TestISO
SET def=$DATA(^%SYS("sql","sys","week ISO8601"))
IF def=0 {SET ^%SYS("sql","sys","week ISO8601")=0}
ELSE {SET isoval=^%SYS("sql","sys","week ISO8601")}
IF isoval=1 {GOTO UnsetISO }
ELSE {SET isoval=0 GOTO WeekOfYear }
UnsetISO
SET ^%SYS("sql","sys","week ISO8601")=0
WeekOfYear
&sql(SELECT {fn WEEK($HOROLOG)} INTO :a)
WRITE "For Today:",!
WRITE "default week of year is ",a,!
SET ^%SYS("sql","sys","week ISO8601")=1
&sql(SELECT {fn WEEK($HOROLOG)} INTO :b)
WRITE "ISO8601 week of year is ",b,!
ResetISO
SET ^%SYS("sql","sys","week ISO8601")=isoval