EXTRACT (日時)
構文
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によって時刻フィールドを持たないANSIDATE
データ型として処理されるため、ここでは有効ではありません。 -
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
を戻します(詳細は、次の例を参照してください)。
関連項目:
-
両方のファイル内のすべてのタイムゾーン地域名のリストは、『Oracle Databaseグローバリゼーション・サポート・ガイド』を参照してください。
-
EXTRACT
の文字の戻り値に割り当てる照合を定義する照合導出ルールは、『Oracle Databaseグローバリゼーション・サポート・ガイド』の付録Cを参照してください。 -
datetime_value_expr
およびinterval_value_expr
の詳細は、日時および期間の演算を参照してください。 -
動的パフォーマンス・ビューの詳細は、『Oracle Databaseリファレンス』を参照してください。
例
次の例では、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
タイムゾーン数値オフセットが式に指定され、その数値オフセットが複数のタイムゾーン地域名をマップする場合、結果があいまいになります。