EXTRACT (日時)

構文

extract_datetime::=

目的

EXTRACTは、日時式または期間式から、指定された日時フィールドの値を抽出して戻します。exprには、要求されたフィールドと互換性のある日時または期間データ型に評価される任意の式を指定できます。

  • YEARまたはMONTHが要求された場合、exprはデータ型DATETIMESTAMPTIMESTAMP WITH TIME ZONETIMESTAMP WITH LOCAL TIME ZONEまたはINTERVAL YEAR TO MONTHの式に評価される必要があります。

  • DAYが要求された場合、exprはデータ型DATETIMESTAMPTIMESTAMP WITH TIME ZONETIMESTAMP WITH LOCAL TIME ZONEまたはINTERVAL DAY TO SECONDの式に評価される必要があります。

  • HOURMINUTEまたはSECONDが要求された場合、exprはデータ型TIMESTAMPTIMESTAMP WITH TIME ZONETIMESTAMP WITH LOCAL TIME ZONEまたはINTERVAL DAY TO SECONDの式に評価される必要があります。DATEは、Oracle Databaseによって時刻フィールドを持たないANSI DATEデータ型として処理されるため、ここでは有効ではありません。

  • TIMEZONE_HOURTIMEZONE_MINUTETIMEZONE_ABBRTIMEZONE_REGIONまたはTIMEZONE_OFFSETが要求された場合、exprはデータ型TIMESTAMP WITH TIME ZONEまたはTIMESTAMP WITH LOCAL TIME ZONEの式に評価される必要があります。

EXTRACTは、exprをANSI日時データ型として解釈します。たとえば、EXTRACTDATEをレガシーOracle DATEではなく、時刻要素を持たないANSI DATEとして処理します。したがって、DATE値からは、YEARMONTHおよび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

タイムゾーン数値オフセットが式に指定され、その数値オフセットが複数のタイムゾーン地域名をマップする場合、結果があいまいになります。