構文
extract_datetime::=
用途
EXTRACT
は、日時式または期間式から、指定された日時フィールドの値を抽出して戻します。expr
には、要求されたフィールドと互換性のある日時または期間データ型に評価される任意の式を指定できます。
YEAR
またはMONTH
が要求された場合、expr
はデータ型DATE
、TIMESTAMP
、TIMESTAMP
WITH
TIME
ZONE
、TIMESTAMP
WITH
LOCAL
TIME
ZONE
またはINTERVAL
YEAR
TO
MONTH
の式に評価される必要があります。
DAY
が要求された場合、expr
はデータ型DATE
、TIMESTAMP
、TIMESTAMP
WITH
TIME
ZONE
、TIMESTAMP
WITH
LOCAL
TIME
ZONE
またはINTERVAL
DAY
TO
SECOND
の式に評価される必要があります。
HOUR
、MINUTE
またはSECOND
が要求された場合、expr
はデータ型TIMESTAMP
、TIMESTAMP
WITH
TIME
ZONE
、TIMESTAMP
WITH
LOCAL
TIME
ZONE
またはINTERVAL
DAY
TO
SECOND
の式に評価される必要があります。DATE
は、Oracle Databaseによって時刻フィールドを持たないANSI DATE
データ型として処理されるため、ここでは有効ではありません。
TIMEZONE_HOUR
、TIMEZONE_MINUTE
、TIMEZONE_ABBR
、TIMEZONE_REGION
またはTIMEZONE_OFFSET
が要求された場合、expr
はデータ型TIMESTAMP
WITH
TIME
ZONE
またはTIMESTAMP
WITH
LOCAL
TIME
ZONE
の式に評価される必要があります。
EXTRACT
は、expr
をANSI日時データ型として解釈します。たとえば、EXTRACT
はDATE
をレガシーOracle DATE
ではなく、時刻要素を持たないANSI DATE
として処理します。したがって、DATE
値からは、YEAR
、MONTH
およびDAY
のみを抽出できます。同様に、TIMESTAMP
WITH
TIME
ZONE
データ型からは、TIMEZONE_HOUR
およびTIMEZONE_MINUTE
のみを抽出できます。
TIMEZONE_REGION
またはTIMEZONE_ABBR
(略称)を指定する場合、戻り値は、適切なタイムゾーン地域名または略称を含むVARCHAR2
文字列です。その他の日時フィールドを指定する場合、戻り値は、グレゴリオ暦での日時値を表すNUMBER
データ型の整数値です。タイムゾーン値を持つ日時から抽出する場合は、UTC形式の値が返されます。有効なタイムゾーン地域名およびそれに対する略称を表示するには、V$TIMEZONE_NAMES
動的パフォーマンス・ビューに問合せを実行してください。
このファンクションは、次に示す最初の例のように、非常に大規模な表の日時フィールド値を操作する場合に特に有効です。
注意: 夏時間機能には、タイムゾーン地域名が必要です。この名前は、大小2つのタイムゾーン・ファイルに格納されます。これらのファイルのうち、使用する環境および使用するOracle Databaseのリリースに応じて、いずれか一方がデフォルトのファイルになります。タイムゾーン・ファイルおよびタイムゾーン名の詳細は、『Oracle Databaseグローバリゼーション・サポート・ガイド』を参照してください。 |
日時フィールドと日時または期間値の式を組み合せると、あいまいな結果になる場合があります。この場合、Oracle Databaseは、UNKNOWN
を戻します(詳細は、次の例を参照してください)。
例
次の例では、oe.orders
表から、各月の注文数を戻します。
SELECT EXTRACT(month FROM order_date) "Month", COUNT(order_date) "No. of Orders" FROM orders GROUP BY EXTRACT(month FROM order_date) ORDER BY "No. of Orders" DESC, "Month"; Month No. of Orders ---------- ------------- 11 15 6 14 7 14 3 11 5 10 2 9 9 9 8 7 10 6 1 5 12 4 4 1 12 rows selected.
次の例では、1998年を戻します。
SELECT EXTRACT(YEAR FROM DATE '1998-03-07') FROM DUAL; EXTRACT(YEARFROMDATE'1998-03-07') --------------------------------- 1998
次の例では、サンプル表hr.employees
から、2007以降に雇用されたすべての従業員を選択します。
SELECT last_name, employee_id, hire_date FROM employees WHERE EXTRACT(YEAR FROM TO_DATE(hire_date, 'DD-MON-RR')) > 2007 ORDER BY hire_date; LAST_NAME EMPLOYEE_ID HIRE_DATE ------------------------- ----------- --------- Johnson 179 04-JAN-08 Grant 199 13-JAN-08 Marvins 164 24-JAN-08 . . .
次の例では、結果があいまいになるため、OracleはUNKNOWN
を戻します。
SELECT EXTRACT(TIMEZONE_REGION FROM TIMESTAMP '1999-01-01 10:00:00 -08:00') FROM DUAL; EXTRACT(TIMEZONE_REGIONFROMTIMESTAMP'1999-01-0110:00:00-08:00') ---------------------------------------------------------------- UNKNOWN
タイムゾーン数値オフセットが式に指定され、その数値オフセットが複数のタイムゾーン地域名をマップする場合、結果があいまいになります。