在查询中使用时间戳函数
可以对时间戳和持续时间值执行各种操作。
您可以将持续时间添加到时间戳,查找两个时间戳之间的差异,并将时间戳舍入到指定的单位。可以使用定制模式将时间戳转换为字符串/从字符串。某些函数支持提取时间戳的日期部分。还可以使用这些函数来显示当前时间。
支持以下时间戳函数:
表 1 - 时间戳函数
| 功能 | 说明 |
|---|---|
| 时间戳添加 | 将期间添加到时间戳值中。 |
| 时间戳差异 | 返回两个时间戳值之间的毫秒数。 |
| 获取持续时间 | 将给定毫秒数转换为持续时间字符串。 |
| 时间戳 _ceil | 将时间戳值向上舍入到指定的单位。 |
| timestamp_floor/timestamp_trunc | 将时间戳值向下舍入到指定的单位。 |
| 时间戳 _ 舍入 | 将时间戳值舍入到指定的单位。 |
| 时间戳 | 将时间戳值舍入到指定间隔的开头,从指定的源值开始。 |
| format_ 时间戳 | 根据指定的模式和时区将时间戳转换为字符串。 |
| 语法分析到时间戳 | 将指定模式中的字符串转换为时间戳值。 |
| to_last_day_of_month | 从给定时间戳返回月份的最后一天。 |
| 时间戳提取函数 | 提取给定时间戳的相应日期部分。支持以下函数:
返回年份内的周数。支持以下函数:
返回给定时间戳中的对应索引。支持以下函数:
|
| 当前时间(毫秒) | 以毫秒数形式返回当前时间。 |
| 当前日期 | 以时间戳值返回当前时间。 |
如果要跟进示例,请参阅运行查询的示例数据以查看示例数据并使用脚本加载示例数据进行测试。这些脚本将创建示例中使用的表,并将数据加载到表中。
如果要跟进示例,请参阅运行查询的示例数据以查看示例数据,并了解如何使用 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 minutes" 的缓冲区并显示该时间。
输出:
{"ARRIVAL_TIME":"2019-02-03T06:05:00.000000000Z"}
注:
列 estimatedArrival 是字符串。如果列具有 ISO-8601 格式的 STRING 值,则该列将由 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指定 UTC 时间。 -
(+|-)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 数组中的每条记录,您需要确定袋子到达时间是否介于现在和六小时后之间。函数 current_time 现在为您提供了时间。EXISTS 条件用作用于确定包是否在接下来的六个小时内具有到达日期的筛选器。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 都有一个操作数组。操作数组中有三个不同的操作。数组中第一个元素的操作代码是 Checkin/Offload。对于第一个行程,操作代码为“签入”,对于其他行程,操作代码为“在跃点卸载”。数组的第二个元素的操作代码是 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 函数向 bagArrivalDate 添加 90 天。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"}
查询将返回航班详细信息,这些详细信息可以用作乘客的快速查找。
周提取函数从时间戳返回相应的周/isoweek。
示例 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() 方法。
Download the full code SQLFunctions.py from the examples here.
# 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 函数。
Download the full code SQLFunctions.go from the examples here.
//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 方法并迭代生成的异步枚举。
Download the full code SQLFunctions.cs from the examples here.
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);