timestamp_add関数

タイムスタンプ(timestamp)値に期間(duration)を追加し、新しいタイムスタンプを返します。期間(duration)は正でも負でもかまいません。結果型はTIMESTAMP(9)です。

構文:
TIMESTAMP(9) timestamp_add(TIMESTAMP timestamp, STRING duration)
セマンティクス:
  • timestamp: TIMESTAMP値またはTIMESTAMPにキャストできる値。
  • duration: [-](<n> <UNIT>)+書式のSTRINGで、'n'は数値で、<UNIT>はYEAR、MONTH、DAY、HOUR、MINUTE、SECOND、MILLISECOND、NANOSECONDまたはこれらのキーワードの複数形式(例: YEARS)です。

    ノート:

    UNITキーワードの大文字と小文字は区別されません。
  • 戻り値: TIMESTAMP(9)

例12-1 航空会社アプリケーションにおいて、遅延5分間のバッファが定刻とみなされる。チケット番号1762399766476の乗客について、第1区間の推定到着時刻を、5分のバッファを含めて出力します

SELECT timestamp_add(bag.bagInfo.flightLegs[0].estimatedArrival, "5 minutes")
AS ARRIVAL_TIME FROM BaggageInfo bag WHERE ticketNo=1762399766476

説明: この航空会社アプリケーションでは、出発地と到着地に応じて顧客にフライト区間がいくつあってもかまいません。前述の問合せでは、旅程の最初の区間(first leg)での推定到着時間(estimated arrival)をフェッチしています。そのため、flightsLeg配列の最初のレコードがフェッチされ、その配列からestimatedArrival時間がフェッチされ、その時間に5分のバッファが追加されて表示されます。

出力:
{"ARRIVAL_TIME":"2019-02-03T06:05:00.000000000Z"}

ノート:

estimatedArrivalはSTRINGです。この列にISO-8601形式でSTRING値が含まれている場合は、SQLランタイムによってそれがTIMESTAMPデータ型に自動変換されます。

例12-2 チケット番号1762399766476の乗客について、各区間における5分のバッファを含む推定到着時刻を出力

SELECT $s.ticketno, $value as estimate, timestamp_add($value, '5 minute') AS add5min
FROM baggageinfo $s,$s.bagInfo.flightLegs.estimatedArrival as $value
WHERE ticketNo=1762399766476

説明: 全区間でのestimatedArrival時間を表示します。区間の数は顧客ごとに異なる可能性があります。したがって、前述の問合せでは変数参照が使用されており、その問合せの実行のためにbaggageInfo配列とflightsLegs配列はネストされていません。

出力:
{"ticketno":1762399766476,"estimate":"2019-02-03T06:00:00Z","add5min":"2019-02-03T06:05:00.000000000Z"}
{"ticketno":1762399766476,"estimate":"2019-02-03T08:22:00Z","add5min":"2019-02-03T08:27:00.000000000Z"}

例12-3 先週到着した荷物の数の確認

SELECT count(*) AS COUNT_LASTWEEK FROM baggageInfo bag WHERE
EXISTS bag.bagInfo[$element.bagArrivalDate > current_time()
AND $element.bagArrivalDate < timestamp_add(current_time(), "-7 days")]

説明: 航空会社アプリケーションによって先週処理された荷物の数を把握します。顧客に複数の荷物がある可能性があります(つまり、bagInfo配列には複数のレコードがある可能性があります)。bagArrivalDateの値は、本日から7日前までである必要があります。bagInfo配列内のレコードごとに、荷物到着時間が現在時間から1週間前までの間にあるかどうかを判定します。current_time関数により、現在時間が返されます。EXISTS条件は、荷物の到着日が過去1週以内であるかどうかを判定するためのフィルタとして使用されています。count関数により、この期間内の荷物の合計数が算出されます。

例12-4 今後6時間以内に到着する荷物の数の確認

SELECT count(*) AS COUNT_NEXT6HOURS FROM baggageInfo bag WHERE
exists bag.bagInfo[$element.bagArrivalDate > current_time()
AND $element.bagArrivalDate < timestamp_add(current_time(), "6 hours")]

説明: 今後6時間以内に航空会社アプリケーションによって処理される荷物の数を把握します。顧客に複数の荷物がある可能性があります(つまり、bagInfo配列には複数のレコードがある可能性があります)。bagArrivalDateは、現在時間から6時間後までである必要があります。bagInfo配列内のレコードごとに、荷物到着時間が現在時間から6時間後までの間にあるかどうかを判定します。current_time関数により、現在時間が返されます。EXISTS条件は、荷物の到着日が今後6時間以内であるかどうかを判定するためのフィルタとして使用されています。count関数により、この期間内の荷物の合計数が算出されます。