dateTime値の一部分を抽出するためのEXTRACTの使用

EXTRACT関数は、dateTime値の一部分(曜日や月など)を抽出します。これが役に立つのは、データをタイムスタンプの一部分でフィルタリングまたはグルーピングする必要がある場合です。たとえば、月曜日の売上合計を計算するときです。

EXTRACT関数の構文は次のとおりです。
<ExtractExpr>   ::=  EXTRACT(<expr>,<DateTimeUnit>)
<DateTimeUnit>  ::=  MILLISECOND | SECOND | MINUTE | HOUR | DAY_OF_WEEK |
                     DAY_OF_MONTH | DAY_OF_YEAR | DATE | WEEK |
                     MONTH | QUARTER | YEAR | JULIAN_DAY_NUMBER
日時の構成要素 戻り値の範囲 メモ
MILLISECOND (0 - 999)
SECOND (0 - 59)
MINUTE (0 - 59)
HOUR (0 - 23)
DAY_OF_WEEK (1 - 7) 週の中での日の位置を返します。日曜日が1です。
DAY_OF_MONTH (DATE) (1 - 31)
DAY_OF_YEAR (1 - 366)
WEEK (1 - 53) 年の中での週の位置を返します。第1週はその年の最初の日に開始します。
MONTH (1 - 12)
QUARTER (1 - 4) 四半期は1月、4月、7月、10月に開始します。
YEAR (-9999 - 9999)
JULIAN_DAY_NUMBER (0 - 5373484) タイムスタンプと紀元前4713年11月24日午前0時との間にある日の数(1日未満の端数は含まない)を表す整数を返します。
たとえば、dateTime型の属性TimeStampの値が10/13/2015 11:35:12.104を表しているとします。次のリストに、EXTRACT演算子を使用してその値の各構成要素を抽出したときの結果を示します。
EXTRACT("TimeStamp", MILLISECOND)          = 104
EXTRACT("TimeStamp", SECOND)               = 12
EXTRACT("TimeStamp", MINUTE)               = 35
EXTRACT("TimeStamp", HOUR)                 = 11
EXTRACT("TimeStamp", DATE)                 = 13
EXTRACT("TimeStamp", WEEK)                 = 41   
EXTRACT("TimeStamp", MONTH)                = 10
EXTRACT("TimeStamp", QUARTER)              = 4   
EXTRACT("TimeStamp", YEAR)                 = 2015
EXTRACT("TimeStamp", DAY_OF_WEEK)          = 5    
EXTRACT("TimeStamp", DAY_OF_MONTH)         = 13
EXTRACT("TimeStamp", DAY_OF_YEAR)          = 286 
EXTRACT("TimeStamp", JULIAN_DAY_NUMBER)    = 2455848
これは、この機能の使用法の単純な例です。次に示す文では、Amount属性の合計値を四半期でグルーピングし、四半期ごとに月曜日(DAY_OF_WEEK=2)の売上の合計を計算します。
RETURN Quarters AS
SELECT SUM(Amount) AS Total
       ARB(TRUNC(TimeStamp, QUARTER)) AS Qtr
FROM SaleState
WHERE EXTRACT(TimeStamp,DAY_OF_WEEK) = 2
GROUP BY Qtr
次に示す例を使用すると、バケット内のクレームを経過期間順にソートできます。
DEFINE ClaimsWithAge AS
SELECT
	ARB(FLOOR((EXTRACT(TO_TZ(CURRENT_TIMESTAMP,claim_tz),JULIAN_DAY_NUMBER)- 
            EXTRACT(TO_TZ(claim_ts,claim_tz),JULIAN_DAY_NUMBER))/7)) AS AgeInWeeks,
	COUNT(1) AS Count
FROM SaleState
GROUP BY AgeInWeeks
HAVING AgeInWeeks < 2
ORDER BY AgeInWeeks;

RETURN Result AS
SELECT
	CASE AgeInWeeks
		WHEN 0 THEN 'Past 7 Days'
		WHEN 1 THEN 'Prior 7 Days'
		       ELSE 'Other'
		END
	AS Label, Count
FROM ClaimsWithAge