在查詢中使用 Timestamp 函數

您可以對時戳和持續時間值執行各種作業。

您可以將持續時間新增至時間戳記、尋找兩個時間戳記之間的差異,以及將時間戳記捨入至指定的單位。您可以使用自訂樣式將時戳轉換成 / 轉換成字串。部分函數支援擷取時間戳記的日期部分。您也可以使用這些函數來顯示目前的時間。

支援下列時戳函數:

表格 1 - 時戳函數

函數 描述
時間戳記新增 將持續時間新增至時間戳記值。
時間戳記差異 傳回兩個時間戳記值之間的毫秒數。
取得持續時間 將指定的毫秒數轉換為持續時間字串。
時間戳記 將時間戳記值進位至指定的單位。
時間戳記 _ 樓層 / 時間戳記 _ 截斷 將時間戳記值向下捨入至指定的單位。
時間戳記 將時間戳記值捨入至指定的單位。
時間戳記 從指定的來源值開始,將時間戳記值捨入至指定間隔的開頭。
格式時間戳記 根據指定的樣式和時區,將時戳轉換成字串。
剖析至時間戳記 將指定樣式中的字串轉換成時戳值。
月份的最後一天 從指定的時間標記傳回月份的最後一天。
時間戳記擷取函數

擷取指定時間戳記的對應日期部分。支援下列函數:

  • 月份
  • 小時
  • 分鐘
  • 第二
  • 毫秒
  • 微秒
  • 奈米秒

傳回當年的週數。支援下列函數:

  • isoweek

從指定的時間戳記傳回對應的索引。支援下列函數:

  • 季別
  • day_of_week
  • day_of_month
  • day_of_year
中文 _English 傳回目前時間為毫秒數。
目前時間 以時間戳記值傳回目前的時間。

如果您想要跟隨範例,請參閱執行查詢的範例資料以檢視範例資料,並使用命令檔載入要測試的範例資料。命令檔會建立範例中使用的表格,並將資料載入表格中。

如果您想要跟隨範例,請參閱執行查詢的範例資料以檢視範例資料,並瞭解如何使用 OCI 主控台建立範例表格,以及使用 JSON 檔案載入資料。

時戳算術函數

您可以使用 timestamp_addtimestamp_diffget_duration 函數,在時間戳記和持續時間值上執行算術運算。

範例 1 - 在航空公司應用程式中,延遲 5 分鐘的緩衝區會被視為「準時」。針對機票號碼為 1762399766476 的乘客,列印第一個航段的預估抵達時間,其緩衝時間為 5 分鐘。

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

說明:在航空公司應用程式中,客戶可以擁有任意數目的航段,視來源與目的地而定。在上方的查詢中,您要擷取預估抵達的差旅「第一段」。因此會擷取 flightsLeg 陣列的第一筆記錄,並從陣列擷取 estimatedArrival 時間,然後將 「5 分鐘」緩衝區新增至該陣列並顯示。

輸出:

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

注意:

資料欄 estimatedArrival 為 STRING。如果資料欄的 STRING 值為 ISO-8601 格式,則 SQL 程式實際執行會將它自動轉換成 TIMESTAMP 資料類型。

ISO8601 說明代表日期、時間和持續時間的國際公認方式。

語法:含時間的日期:YYYY-MM-DDThh:mm:ss[.s[s[s[s[s[s]]]]][Z|(+|-)hh:mm]

其中:

範例 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 陣列和 flightLegs 陣列則不是巢狀的,用來執行查詢。

輸出:

{"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"}

範例 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 陣列中的每筆記錄,您可以判斷包裹到達時間是否介於現在與一週前之間。函數 current_time 會提供您現在的時間。EXISTS 條件是用來作為篩選,以判斷包裝袋的抵達日期是否在上週。count 函數會決定此期間內的包袋總數。

輸出:

{"COUNT_LASTWEEK":0}

範例 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 函數會決定此期間內的包袋總數。

輸出:

{"COUNT_NEXT6HOURS":0}

範例 5 - 行李在一個航段登機到下一個航段之間的持續時間,以及機票號碼為 1762355527825 的乘客到達下一個航段的時間為何?

SELECT $s.ticketno, $bagInfo.bagArrivalDate, $flightLeg.flightDate,
get_duration(timestamp_diff($bagInfo.bagArrivalDate, $flightLeg.flightDate)) AS diff
FROM baggageinfo $s,
$s.bagInfo[] AS $bagInfo, $bagInfo.flightLegs[] AS $flightLeg
WHERE ticketNo=1762355527825

說明:在航空公司應用程式中,每個客戶在其來源與目的地之間可以有不同數目的躍點 / 航段。在此查詢中,您可以決定每個航段之間所花費的時間。這取決於每個航段的 bagArrivalDateflightDate 之間的差異。若要決定天數、時數或分鐘數的持續時間,請將 timestamp_diff 函數的結果傳送至 get_duration 函數。

輸出:

{"bagArrivalDate":"2019-03-22T10:17:00Z","flightDate":"2019-03-22T07:00:00Z",
"diff":"3 hours 17 minutes"}
{"bagArrivalDate":"2019-03-22T10:17:00Z","flightDate":"2019-03-22T07:23:00Z",
"diff":"2 hours 54 minutes"}
{"bagArrivalDate":"2019-03-22T10:17:00Z","flightDate":"2019-03-22T08:23:00Z",
"diff":"1 hour 54 minutes"}

若要判斷持續時間 (毫秒),請使用 timestamp_diff 函數。

SELECT $s.ticketno, $bagInfo.bagArrivalDate, $flightLeg.flightDate,
timestamp_diff($bagInfo.bagArrivalDate, $flightLeg.flightDate) AS diff
FROM baggageinfo $s,
$s.bagInfo[] AS $bagInfo,
$bagInfo.flightLegs[] AS $flightLeg
WHERE ticketNo=1762355527825

輸出:

{"bagArrivalDate":"2019-03-22T10:17:00Z","flightDate":"2019-03-22T07:00:00Z","diff":11820000}
{"bagArrivalDate":"2019-03-22T10:17:00Z","flightDate":"2019-03-22T07:23:00Z","diff":10440000}
{"bagArrivalDate":"2019-03-22T10:17:00Z","flightDate":"2019-03-22T08:23:00Z","diff":6840000}

範例 6 - 從辦理登機手續到登機手續時,機票號碼為 176234463813 的乘客需要多久時間?

SELECT $flightLeg.flightNo,
$flightLeg.actions[contains($element.actionCode, "Checkin")].actionTime AS checkinTime,
$flightLeg.actions[contains($element.actionCode, "BagTag Scan")].actionTime AS bagScanTime,
get_duration(timestamp_diff(
    $flightLeg.actions[contains($element.actionCode, "Checkin")].actionTime,
    $flightLeg.actions[contains($element.actionCode, "BagTag Scan")].actionTime
)) AS diff
FROM baggageinfo $s,
$s.bagInfo[].flightLegs[] AS $flightLeg
WHERE ticketNo=176234463813 AND
starts_with($s.bagInfo[].routing, $flightLeg.fltRouteSrc)

說明:在行李資料中,每個 flightLeg 都有一個動作陣列。動作陣列中有三個不同的動作。陣列中第一個元素的動作代碼為「存入 / 卸載」。對於第一個航段,動作代碼為「簽入」,而對其他航段而言,動作代碼為躍點時的「卸載」。陣列的第二個元素的動作代碼為 BagTag Scan。在上方的查詢中,您決定包裹標記掃描與存入時間之間的動作時間差異。只有當動作代碼為 Checkin 或 BagScan 時,您才可以使用 contains 函數來篩選動作時間。由於只有第一個航段具有辦理登機手續和行李掃描的詳細資料,因此您額外使用 starts_with 函數篩選資料,以便僅擷取原始碼 fltRouteSrc。若要決定天數、時數或分鐘數的持續時間,請將 timestamp_diff 函數的結果傳送至 get_duration 函數。

若要判斷持續時間 (毫秒),請使用 timestamp_diff 函數。

SELECT $flightLeg.flightNo,
$flightLeg.actions[contains($element.actionCode, "Checkin")].actionTime AS checkinTime,
$flightLeg.actions[contains($element.actionCode, "BagTag Scan")].actionTime AS bagScanTime,
timestamp_diff(
   $flightLeg.actions[contains($element.actionCode, "Checkin")].actionTime,
   $flightLeg.actions[contains($element.actionCode, "BagTag Scan")].actionTime
) AS diff
FROM baggageinfo $s,
$s.bagInfo[].flightLegs[] AS $flightLeg
WHERE ticketNo=176234463813 AND
starts_with($s.bagInfo[].routing, $flightLeg.fltRouteSrc)

輸出:

{"flightNo":"BM572","checkinTime":"2019-03-02T03:28:00Z",
"bagScanTime":"2019-03-02T04:52:00Z","diff":"- 1 hour 24 minutes"}

範例 7 - 標牌號碼為 1762320369957 的客戶行李需要多久時間才能到達第一個在途點?

SELECT  $bagInfo.flightLegs[1].actions[2].actionTime,
$bagInfo.flightLegs[0].actions[0].actionTime,
get_duration(timestamp_diff($bagInfo.flightLegs[1].actions[2].actionTime,
                            $bagInfo.flightLegs[0].actions[0].actionTime)) AS diff
FROM baggageinfo $s, $s.bagInfo[] AS $bagInfo
WHERE ticketNo=1762320369957

說明:在航空公司應用程式中,每個客戶在其來源與目的地之間可以有不同數目的躍點 / 航段。在上面的範例中,您可以決定袋子到達第一個在途點所花費的時間。在行李資料中,flightLeg 是一個陣列。陣列中的第一筆記錄會參照第一個在途點詳細資料。第一個記錄中的 flightDate 是袋子離開來源的時間,第一個航段記錄中的 estimatedArrival 則表示到達第一個運輸點的時間。兩者之間的差別在於,袋子到達第一個在途點所花費的時間。若要決定天數、時數或分鐘數的持續時間,請將 timestamp_diff 函數的結果傳送至 get_duration 函數。

若要判斷持續時間 (毫秒),請使用 timestamp_diff 函數。

SELECT  $bagInfo.flightLegs[0].flightDate,
$bagInfo.flightLegs[0].estimatedArrival,
timestamp_diff($bagInfo.flightLegs[0].estimatedArrival,
$bagInfo.flightLegs[0].flightDate) AS diff
FROM baggageinfo $s, $s.bagInfo[] AS $bagInfo
WHERE ticketNo=1762320369957

輸出:

{"flightDate":"2019-03-12T03:00:00Z","estimatedArrival":"2019-03-12T16:00:00Z","diff":"13 hours"}
{"flightDate":"2019-03-12T03:00:00Z","estimatedArrival":"2019-03-12T16:40:00Z","diff":"13 hours 40 minutes"}

時間戳記捨入函數

您可以使用 timestamp_ceiltimestamp_floortimestamp_trunctimestamp_roundtimestamp_bucket 函數來四捨五入時戳值。

對於 timestamp_ceiltimestamp_floortimestamp_trunctimestamp_round 函數,您必須提供 unit 作為第二個引數。unit 指定捨入輸入時戳時要考量的精確度。

單一或複數格式支援下列單位:YEAR, IYEAR, QUARTER, MONTH, WEEK, IWEEK, DAY, HOUR, MINUTE, SECOND

您可以使用 timestamp_bucket 函數,將指定的時間戳記值捨入至指定間隔 (時段) 的開頭。間隔會從時間軸上的指定來源開始。

timestamp_bucket 支援單一或複數格式的下列間隔:WEEK, DAY, HOUR, MINUTE, SECOND

範例 1 - 從航空公司行李追蹤資料中,列印機票號碼為 1762344493810 之乘客的行李抵達日期與行李拍賣日期,並將行李保留期間視為 90 天。

SELECT $b.bagArrivalDate AS BagArrival,
timestamp_ceil(timestamp_add($b.bagArrivalDate, "90 Days"), 'day') AS BagCollection
FROM BaggageInfo bag, bag.bagInfo AS $b
WHERE ticketNo=1762344493810

說明:此查詢顯示如何將時戳函數巢狀化。若要確定保留未申報的包裝日期,請使用 timestamp_add 函數將 90 天新增至 bagArrivalDatetimestamp_ceil 函數會將值進位至次日的開頭。

輸出:

{"BagArrival":"2019-02-01T16:13:00Z","BagCollection":"2019-05-03T00:00:00Z"}

範例 2 - 列印所有在 2019 年 3 月於原來機場 JFK 登機之乘客的姓名、航班編號及差旅日期。

SELECT bag.fullName, $f.flightNo, $f.flightDate
FROM BaggageInfo bag, bag.bagInfo[0].flightLegs[0] AS $f
WHERE $f.fltRouteSrc = "JFK" AND timestamp_floor($f.flightDate, 'MONTH') = '2019-03-01'

說明:您可以使用單位值為 MONTH 的 timestamp_floor 函數,將差旅日期捨入至月初。然後,您可以比較結果時間戳記值與字串 "2019-03-01" 來選取所需的乘客。此查詢不會考慮運輸中的乘客。

此範例提供 ISO-8601 格式字串中的日期,該字串會以隱含方式將 CAST 變為 TIMESTAMP 值。

為了避免因乘客有多個托運行李而導致的結果重複,您僅考慮此查詢中 bagInfo 陣列的第一個元素。

輸出:

{"fullName":"Kendal Biddle","flightNo":"BM127","flightDate":"2019-03-04T06:00:00Z"}
{"fullName":"Dierdre Amador","flightNo":"BM495","flightDate":"2019-03-07T07:00:00Z"}

範例 3 - 從航空公司行李追蹤資料中,列印在原站 MEL 的託運行李上執行的所有活動。將動作調整為一分鐘的間隔。

SELECT $b.actionAt,
       $b.actionCode,
       timestamp_round($b.actionTime, 'MINUTE') as actionTime
FROM baggageInfo bag, bag.bagInfo[0].flightLegs[0].actions[] AS $b
WHERE bag.bagInfo[0].flightLegs[0].fltRouteSrc = "MEL"

說明:在此查詢中,您可以使用單位為 MINUTE 的 timestamp_round 函數,將 actionTime 四捨五入至最接近的分鐘。

為了避免因乘客有多個托運行李而導致的結果重複,您僅考慮此查詢中 bagInfo 陣列的第一個元素。

輸出:

{"actionAt":"MEL","actionCode":"ONLOAD to LAX","actionTime":"2019-03-01T12:20:00Z"}
{"actionAt":"MEL","actionCode":"BagTag Scan at MEL","actionTime":"2019-03-01T11:52:00Z"}
{"actionAt":"MEL","actionCode":"Checkin at MEL","actionTime":"2019-03-01T11:43:00Z"}

範例 4 - 從 2019 年 1 月 1 日起,每 12 小時擷取從 IST 機場出發的乘客數統計資料。僅考慮 2019 年 2 月的資料。

SELECT $t AS DATE,
count($t) AS FLIGHTCOUNT
FROM BaggageInfo bag, bag.bagInfo[0].flightLegs[] $f,
timestamp_bucket($f.flightDate, '12 HOURS', '2019-01-01T00') $t
WHERE $f.fltRouteSrc =any "IST" AND timestamp_floor($f.flightDate, 'MONTH') = '2019-02-01T00:00:00Z'
GROUP BY $t
ORDER BY $t

說明:若要考量在 2019 年 2 月旅行的乘客,請使用 timestamp_floor 函數,然後將 flightDate 捨入至當月的開頭。比較結果與字串 "2019-02-01T00:00:00Z"。此範例提供 ISO-8601 格式字串中的日期,該字串會以隱含方式將 CAST 變為 TIMESTAMP 值。

若要包含來自 IST 機場的過境航班,請使用陣列建構子 [ ] 來指示 flightLegs 是一個陣列,並考量搜尋中的每個 fltRouteSrc 陣列元素。

flightDate 欄位使用 timsestamp_bucket 函數,其間隔為 12 小時,且來源為 2019 年 1 月 1 日。

輸出:

{"DATE":"2019-02-02T12:00:00.000000000Z","FLIGHTCOUNT":1}
{"DATE":"2019-02-04T00:00:00.000000000Z","FLIGHTCOUNT":1}
{"DATE":"2019-02-04T12:00:00.000000000Z","FLIGHTCOUNT":2}
{"DATE":"2019-02-07T12:00:00.000000000Z","FLIGHTCOUNT":1}
{"DATE":"2019-02-11T12:00:00.000000000Z","FLIGHTCOUNT":1}
{"DATE":"2019-02-12T00:00:00.000000000Z","FLIGHTCOUNT":2}
{"DATE":"2019-02-12T12:00:00.000000000Z","FLIGHTCOUNT":1}

時戳格式函數

您可以使用 format_timestampparse_to_timestamp 函數來格式化時戳值。此外,您可以使用 to_last_day_of_month 函數,從指定的時間戳記擷取當月的最後一天。

範例 1 - 對於具有特定機票號碼的乘客,請根據輸入的 patterntimezone,將預估抵達時間列印在第一個航段。

SELECT $info.estimatedArrival,
format_timestamp($info.estimatedArrival, "MMM dd, yyyy HH:mm:ss O", "America/Vancouver") AS FormattedTimestamp
FROM BaggageInfo bag, bag.bagInfo.flightLegs[0] AS $info
WHERE ticketNo= 1762399766476

說明:在此查詢中,指定 estimatedArrival 欄位、pattern 以及 timezone 的全名作為 format_timestamp 函數的引數,以將 timestamp 字串轉換成指定的 "MMM dd, yyyy HH:mm:ss" 樣式。

注意:pattern 引數中的字母 'O' 代表 ZoneOffset,它會列印結果字串中與 Greenwich/UTC 不同的時間量。

輸出:

{"estimatedArrival":"2019-02-03T06:00:00Z","FormattedTimestamp":"Feb 02, 2019 22:00:00 GMT-8"}

範例 2 - 將具有指定 pattern (包括區域位移) 的指定 string 剖析為時戳。

SELECT format_timestamp(parse_to_timestamp('2024/02/12 18:30:54 GMT+02:00', "yyyy/dd/MM HH:mm:ss OOOO"),"yyyy-MM-dd HH:mm:ss OOOO","GMT+02:00")AS TIMESTAMP
FROM BaggageInfo
WHERE ticketNo=1762390789239

說明:在此查詢中,string 引數具有 TimeZoneID、GMT+02:00,因此 pattern 引數必須包含區域符號或 ZoneOffset。在 format_timestamp 函數中包裝時,輸出時戳會以 GMT+02:00 時區顯示。

輸出:

{"TIMESTAMP":"2024-12-02 18:30:54 GMT+02:00"}

範例 3 - 對於訂戶,列印帳戶訂閱到期當月的最後一天。

SELECT sa.acct_id, to_last_day_of_month(sa.account_expiry) AS lastday FROM stream_acct sa WHERE profile_name="DM"

輸出:

{"acct_id":4,"lastday":"2024-03-31T00:00:00Z"}

時間戳記擷取功能

時戳擷取函數會從指定的時戳擷取對應的日期、週或索引值。

日期擷取函數會從時間戳記傳回對應的年 / 月 / 日 / 小時 / 分鐘 / 秒 / 毫秒 / 微秒 / 奈秒。

範例 1 - 從航空公司行李追蹤資料中取得乘客的綜合差旅詳細資料。

在航空公司申請中,對乘客有利於快速瞭解即將到來的旅遊詳細資料。您可以使用其他時間功能,從 BaggageInfo 表格取得乘客的合併差旅詳細資料。

SELECT DISTINCT
$s.fullName,
$s.bagInfo[].flightLegs[].flightNo AS flightnumbers,
$s.bagInfo[].flightLegs[].fltRouteSrc AS From,
concat ($t1,":", $t2,":", $t3) AS Traveldate
FROM baggageinfo $s, $s.bagInfo[].flightLegs[].flightDate AS $bagInfo,
day(CAST($bagInfo AS Timestamp(0))) $t1,
month(CAST($bagInfo AS Timestamp(0))) $t2,
year(CAST($bagInfo AS Timestamp(0))) $t3

說明:

您可以使用時間函數來擷取差旅日期、月份和年度。concat 字串函數是用來串連擷取的差旅記錄,以便在應用程式上以所需的格式顯示這些記錄。您首先使用 CAST 表示式將 flightDates 轉換為 TIMESTAMP,然後從時間戳記擷取日期、月份和年度詳細資訊。

輸出:

{"fullName":"Adam Phillips","flightnumbers":["BM604","BM667"],"From":["MIA","LAX"],"Traveldate":"1:2:2019"}

{"fullName":"Adelaide Willard","flightnumbers":["BM79","BM907"],"From":["GRU","ORD"],"Traveldate":"15:2:2019"}

此查詢會傳回航班明細,可作為乘客的快速查尋。

週擷取函數會從時間戳記傳回對應的週 / 週。

範例 2 - 決定乘客差旅日期的週數與 ISO 週數。

SELECT
$s.fullName,
$s.contactPhone,
week(CAST($bagInfo.flightLegs[1].flightDate AS Timestamp(0))) AS TravelWeek,
isoweek(CAST($bagInfo.flightLegs[1].flightDate AS Timestamp(0))) AS ISO_TravelWeek
FROM baggageinfo $s, $s.bagInfo[] AS $bagInfo

說明:您首先使用 CAST 表示式將 flightDate 轉換成 TIMESTAMP,然後從時間戳記擷取週和 isoweek。

輸出:

{"fullName":"Adelaide Willard","contactPhone":"421-272-8082","TravelWeek":7,"ISO_TravelWeek":7}

{"fullName":"Adam Phillips","contactPhone":"893-324-1064","TravelWeek":5,"ISO_TravelWeek":5}

時間戳記索引擷取函數會從時間戳記傳回對應的季 / 週 / 月 / 年索引。

範例 3 - 尋找指定時間戳記的每週固定日期。

SELECT day_of_week("2024-06-19") AS DAYVAL1,
day_of_week(parse_to_timestamp('06/19/24', 'MM/dd/yy')) AS DAYVAL2
FROM BaggageInfo
WHERE ticketNo=1762344493810

說明:查詢中的第二個時戳本身為不支援的格式 '06/19/24',因此請將它包裝在 parse_to_timestamp 函數中,使其生效。

輸出:

{
  "DAYVAL1" : 3,
  "DAYVAL2" : 3
}

目前的時間函數

您可以使用 current_time_milliscurrent_time 函數來擷取目前的時間。current_time_millis 函數會將時間傳回為毫秒數。current_time 函數會將時間傳回為時戳值。

範例 1 - 決定乘客最後差旅日期與目前日期之間的時間失效。

在航空公司申請中,少數客戶經常出差,且有權獲得飛行里數獎勵。您可以決定乘客最後差旅日期與目前日期之間的時間失效,以評估是否可考慮此類獎勵方案。

SELECT
$s.fullName,
$s.contactPhone,
get_duration(timestamp_diff(current_time(), CAST($bagInfo.flightLegs[1].flightDate AS Timestamp(0)))) AS LastTravel
FROM baggageinfo $s, $s.bagInfo[] AS $bagInfo

說明:

您可以使用 current_time 函數來取得目前的時間。若要判斷上次差旅日期與目前日期之間的時間範圍,您可以提供目前時間至 get_duration/timestamp_diff 函數以及上次差旅時間。如需有關 timestamp_diffget_duration 函數的詳細資訊。

輸出:

{"fullName":"Adelaide Willard","contactPhone":"421-272-8082","LastTravel":"1453 days 6 hours 20 minutes 56 seconds 601 milliseconds"}

{"fullName":"Adam Phillips","contactPhone":"893-324-1064","LastTravel":"1451 days 23 hours 19 minutes 39 seconds 543 milliseconds"}

您可以使用 current_time 函數來計算目前的時間。使用 timestamp_diff 函式來計算目前時間與上次飛行日期之間的時間差異。您首先使用 CAST 表示式將 flightDates 轉換為 TIMESTAMP,然後從時間戳記擷取日、月和年詳細資訊。由於 timestamp_diff 函數會傳回兩個時戳值之間的毫秒數,因此您可以使用 get_duration 函數將毫秒轉換為持續時間字串。

get_duration 函數會根據傳回值將毫秒轉換為天數、時數、分鐘數、秒數和毫秒數。下列轉換是基於計算目的考量:

1000 milliseconds = 1 second
60 seconds = 1 minute
60 minutes = 1 hour
24 hours = 1 day

例如:如果 timestamp_diff 函數傳回 129084684821 毫秒值,get_duration 函數會將它相對應轉換成 1494 天 52 分鐘 4 秒 687 毫秒

使用 QueryRequest API 的範例

您可以使用 QueryRequest API 並套用 SQL 函數,從 NoSQL 表格擷取資料。

若要執行查詢,請使用 NoSQLHandle.query() API。

Download the full code SQLFunctions.java from the examples here.

 //Fetch rows from the table
private static void fetchRows(NoSQLHandle handle,String sqlstmt) throws Exception {
   try (
      QueryRequest queryRequest = new QueryRequest().setStatement(sqlstmt);
      QueryIterableResult results = handle.queryIterable(queryRequest)){
      for (MapValue res : results) {
         System.out.println("\t" + res);
      }
   }
}
String ts_func1="SELECT timestamp_add(bag.bagInfo.flightLegs[0].estimatedArrival, "5 minutes")"+
                         " AS ARRIVAL_TIME FROM BaggageInfo bag WHERE ticketNo=1762341772625";
System.out.println("Using timestamp_add function ");
fetchRows(handle,ts_func1);
String ts_func2="SELECT $s.ticketno, $bagInfo.bagArrivalDate, $flightLeg.flightDate, "+
                "get_duration(timestamp_diff($bagInfo.bagArrivalDate, $flightLeg.flightDate)) AS diff "+
                 "FROM baggageinfo $s, $s.bagInfo[] AS $bagInfo, $bagInfo.flightLegs[] AS $flightLeg "+
                 "WHERE ticketNo=1762344493810";
System.out.println("Using get_duration and timestamp_diff function ");
fetchRows(handle,ts_func2);

若要執行您的查詢,請使用 borneo.NoSQLHandle.query() 方法。

此處的範例下載完整程式碼 SQLFunctions.py

# Fetch data from the table
def fetch_data(handle,sqlstmt):
   request = QueryRequest().set_statement(sqlstmt)
   print('Query results for: ' + sqlstmt)
   result = handle.query(request)
   for r in result.get_results():
      print('\t' + str(r))
 ts_func1 = '''SELECT timestamp_add(bag.bagInfo.flightLegs[0].estimatedArrival, "5 minutes")
                 AS ARRIVAL_TIME FROM BaggageInfo bag WHERE ticketNo=1762341772625'''
print('Using timestamp_add function:')
fetch_data(handle,ts_func1)

ts_func2 = '''SELECT $s.ticketno, $bagInfo.bagArrivalDate, $flightLeg.flightDate,
              get_duration(timestamp_diff($bagInfo.bagArrivalDate, $flightLeg.flightDate)) AS diff
              FROM baggageinfo $s,
              $s.bagInfo[] AS $bagInfo, $bagInfo.flightLegs[] AS $flightLeg
              WHERE ticketNo=1762344493810'''
print('Using get_duration and timestamp_diff function:')
fetch_data(handle,ts_func2)

若要執行查詢,請使用 Client.Query 函數。

請從此處的範例下載完整程式碼 SQLFunctions.go

 //fetch data from the table
func fetchData(client *nosqldb.Client, err error, tableName string, querystmt string)(){
   prepReq := &nosqldb.PrepareRequest{
		Statement: querystmt,
   }
   prepRes, err := client.Prepare(prepReq)
   if err != nil {
      fmt.Printf("Prepare failed: %v\n", err)
      return
   }
   queryReq := &nosqldb.QueryRequest{
		 PreparedStatement: &prepRes.PreparedStatement,   }
   var results []*types.MapValue
   for {
      queryRes, err := client.Query(queryReq)
      if err != nil {
         fmt.Printf("Query failed: %v\n", err)
  	return
      }
      res, err := queryRes.GetResults()
      if err != nil {
         fmt.Printf("GetResults() failed: %v\n", err)
  	return
      }
      results = append(results, res...)
      if queryReq.IsDone() {
         break
      }
   }
   for i, r := range results {
      fmt.Printf("\t%d: %s\n", i+1, jsonutil.AsJSON(r.Map()))
   }
}
ts_func1 := `SELECT timestamp_add(bag.bagInfo.flightLegs[0].estimatedArrival, "5 minutes")
                AS ARRIVAL_TIME FROM BaggageInfo bag WHERE ticketNo=1762341772625`
fmt.Printf("Using timestamp_add function::\n")
fetchData(client, err,tableName,ts_func1)

ts_func2 := `SELECT $s.ticketno, $bagInfo.bagArrivalDate, $flightLeg.flightDate,
             get_duration(timestamp_diff($bagInfo.bagArrivalDate, $flightLeg.flightDate)) AS diff
             FROM baggageinfo $s,
             $s.bagInfo[] AS $bagInfo, $bagInfo.flightLegs[] AS $flightLeg
             WHERE ticketNo=1762344493810`
fmt.Printf("Using get_duration and timestamp_diff function:\n")
fetchData(client, err,tableName,ts_func2)

若要執行查詢,請使用 query 方法。

JavaScript:請從此處的範例下載完整程式碼 SQLFunctions.js

  //fetches data from the table
async function fetchData(handle,querystmt) {
   const opt = {};
   try {
      do {
         const result = await handle.query(querystmt, opt);
         for(let row of result.rows) {
            console.log('  %O', row);
         }
         opt.continuationKey = result.continuationKey;
      } while(opt.continuationKey);
   } catch(error) {
      console.error('  Error: ' + error.message);
   }
}

TypeScript:此處的範例下載完整的程式碼 SQLFunctions.ts

interface StreamInt {
   acct_Id: Integer;
   profile_name: String;
   account_expiry: TIMESTAMP;
   acct_data: JSON;
}
/* fetches data from the table */
async function fetchData(handle: NoSQLClient,querystmt: string) {
   const opt = {};
   try {
      do {
         const result = await handle.query<StreamInt>(querystmt, opt);
         for(let row of result.rows) {
            console.log('  %O', row);
         }
         opt.continuationKey = result.continuationKey;
      } while(opt.continuationKey);
   } catch(error) {
      console.error('  Error: ' + error.message);
   }
}
const ts_func1 = `SELECT timestamp_add(bag.bagInfo.flightLegs[0].estimatedArrival, "5 minutes")
                  AS ARRIVAL_TIME FROM BaggageInfo bag WHERE ticketNo=1762341772625`
console.log("Using timestamp_add function:");
await fetchData(handle,ts_func1);

const ts_func2 = `SELECT $s.ticketno, $bagInfo.bagArrivalDate, $flightLeg.flightDate,
                  get_duration(timestamp_diff($bagInfo.bagArrivalDate, $flightLeg.flightDate)) AS diff
                  FROM baggageinfo $s,
                  $s.bagInfo[] AS $bagInfo, $bagInfo.flightLegs[] AS $flightLeg
                  WHERE ticketNo=1762344493810`
console.log("Using get_duration and timestamp_diff function:");
await fetchData(handle,ts_func2);

若要執行查詢,您可以呼叫 QueryAsync 方法或呼叫 GetQueryAsyncEnumerable 方法,然後重複產生的非同步列舉項目。

此處的範例下載完整程式碼 SQLFunctions.cs

private static async Task fetchData(NoSQLClient client,String querystmt){
   var queryEnumerable = client.GetQueryAsyncEnumerable(querystmt);
   await DoQuery(queryEnumerable);
}

private static async Task DoQuery(IAsyncEnumerable<QueryResult<RecordValue>> queryEnumerable){
   Console.WriteLine("  Query results:");
   await foreach (var result in queryEnumerable) {
      foreach (var row in result.Rows)
      {
         Console.WriteLine();
         Console.WriteLine(row.ToJsonString());
      }
   }
}
private const string ts_func1 =@"SELECT timestamp_add(bag.bagInfo.flightLegs[0].estimatedArrival, ""5 minutes"")
                                       AS ARRIVAL_TIME FROM BaggageInfo bag WHERE ticketNo=1762341772625";
Console.WriteLine("\nUsing timestamp_add function!");
await fetchData(client,ts_func1);

private const string ts_func2 =@"SELECT $s.ticketno, $bagInfo.bagArrivalDate, $flightLeg.flightDate,
                                       get_duration(timestamp_diff($bagInfo.bagArrivalDate, $flightLeg.flightDate)) AS diff
                                       FROM baggageinfo $s,
                                       $s.bagInfo[] AS $bagInfo, $bagInfo.flightLegs[] AS $flightLeg
                                       WHERE ticketNo=1762344493810";
Console.WriteLine("\nUsing get_duration and timestamp_diff function!");
await fetchData(client,ts_func2);

相關主題