在查詢中使用 Timestamp 函數
您可以對時戳和持續時間值執行各種作業。
您可以將持續時間新增至時間戳記、尋找兩個時間戳記之間的差異,以及將時間戳記捨入至指定的單位。您可以使用自訂樣式將時戳轉換成 / 轉換成字串。部分函數支援擷取時間戳記的日期部分。您也可以使用這些函數來顯示目前的時間。
支援下列時戳函數:
表格 1 - 時戳函數
| 函數 | 描述 |
|---|---|
| 時間戳記新增 | 將持續時間新增至時間戳記值。 |
| 時間戳記差異 | 傳回兩個時間戳記值之間的毫秒數。 |
| 取得持續時間 | 將指定的毫秒數轉換為持續時間字串。 |
| 時間戳記 | 將時間戳記值進位至指定的單位。 |
| 時間戳記 _ 樓層 / 時間戳記 _ 截斷 | 將時間戳記值向下捨入至指定的單位。 |
| 時間戳記 | 將時間戳記值捨入至指定的單位。 |
| 時間戳記 | 從指定的來源值開始,將時間戳記值捨入至指定間隔的開頭。 |
| 格式時間戳記 | 根據指定的樣式和時區,將時戳轉換成字串。 |
| 剖析至時間戳記 | 將指定樣式中的字串轉換成時戳值。 |
| 月份的最後一天 | 從指定的時間標記傳回月份的最後一天。 |
| 時間戳記擷取函數 | 擷取指定時間戳記的對應日期部分。支援下列函數:
傳回當年的週數。支援下列函數:
從指定的時間戳記傳回對應的索引。支援下列函數:
|
| 中文 _English | 傳回目前時間為毫秒數。 |
| 目前時間 | 以時間戳記值傳回目前的時間。 |
如果您想要跟隨範例,請參閱執行查詢的範例資料以檢視範例資料,並使用命令檔載入要測試的範例資料。命令檔會建立範例中使用的表格,並將資料載入表格中。
如果您想要跟隨範例,請參閱執行查詢的範例資料以檢視範例資料,並瞭解如何使用 OCI 主控台建立範例表格,以及使用 JSON 檔案載入資料。
時戳算術函數
您可以使用 timestamp_add、timestamp_diff 或 get_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]
其中:
-
YYYY將年份指定為四個小數位數。 -
MM將月份指定為兩位小數,00至12。 -
DD將天指定為兩位小數,00至31。 -
hh將小時指定為兩個小數位數,00至23。 -
mm將分鐘指定為兩個小數位數 (00到59)。 -
ss[.s[s[s[s[s]]]]]會將秒指定為00到59的兩位小數位數 (選擇性),後面接著一個小數位數和 1 到 6 位小數位數 (代表第二個小數位數部分)。 -
Z指定 UTC 時間或時區 0。您也可以使用+00:00來指定 UTC 時間,但不能使用-00:00。 -
(+|-)hh:mm指定時區作為 UTC 的差異。必須使用+或-其中之一。
範例 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
說明:在航空公司應用程式中,每個客戶在其來源與目的地之間可以有不同數目的躍點 / 航段。在此查詢中,您可以決定每個航段之間所花費的時間。這取決於每個航段的 bagArrivalDate 與 flightDate 之間的差異。若要決定天數、時數或分鐘數的持續時間,請將 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_ceil、timestamp_floor、timestamp_trunc、timestamp_round 和 timestamp_bucket 函數來四捨五入時戳值。
對於 timestamp_ceil、timestamp_floor、timestamp_trunc 及 timestamp_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 天新增至 bagArrivalDate。timestamp_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_timestamp 和 parse_to_timestamp 函數來格式化時戳值。此外,您可以使用 to_last_day_of_month 函數,從指定的時間戳記擷取當月的最後一天。
範例 1 - 對於具有特定機票號碼的乘客,請根據輸入的 pattern 和 timezone,將預估抵達時間列印在第一個航段。
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_millis 和 current_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_diff 和 get_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);