BigQuery:格式化 ISO 日期
BigQuery: Format ISO Date
我正在尝试解析 ISO 日期 8601 格式的时间戳。
示例:2021-04-10T14:11:00Z
此信息存储在 JSON 对象中,因此我将该数据提取为字符串:
我正在寻找的格式是 yy-MM-dd hh:mm 格式,为此我尝试了以下格式
SQL 代码
SELECT document_id,
json_extract(data, '$.Pair') as pair,
PARSE_TIMESTAMP('%y-%m-%d %H:%M', json_extract(data, '$.AlertTime')) as alerttime,
COUNT(document_id) as alert_count
FROM `tradingview-alerts-26eb8.alltables.TradingView_000_raw_latest` as alert_view
GROUP BY alerttime, document_id, pair
错误
上面的代码导致以下错误:
Failed to parse input string '"2021-04-10T03:17:00Z"
原因是日期中间的T,我相信,
为了放弃我尝试了这个改变:
SUBSTR(json_extract(data, '$.AlertTime'), 1, 10))
但是我在另一行收到错误消息:
Failed to parse input string '"2021-04-1'
我想知道是不是因为日期的显示方式(年-月-日)没有两位数?例如 2021-04-01 而不是 2021-04-1.
但是如果我尝试
SUBSTR(json_extract(data, '$.AlertTime'), 1, 11))
我得到的错误是
Failed to parse input string '"2021-04-10'
您需要将这些 ISO 符号作为常量包含到格式说明符中:
select parse_timestamp('%FT%TZ', '2021-04-12T17:38:10Z')
| f0_ |
---------------------------
| 2021-04-12 17:38:10 UTC |
UPD:如果你有小数秒,你可以包含可选的毫秒元素 %E*S
而不是时间元素 %T
。对于非 UTC 时间戳,还应该有时区元素:%Ez
。因此,可能的解决方案可能是:
with a as (
select '2021-04-12T20:44:06.95841Z' as ts_str union all
select '2021-04-12T23:44:07.83738+03:00' union all
select '2021-04-12T23:44:08+03:00'
)
select parse_timestamp('%FT%H:%M:%E*S%Ez', regexp_replace(ts_str, 'Z$', '+00:00')) as ts
from a
| ts |
|--------------------------------|
| 2021-04-12 20:44:06.958410 UTC |
| 2021-04-12 20:44:07.837380 UTC |
| 2021-04-12 20:44:08 UTC |
我认为你可以使用 timestamp => datetime func。
像这样
datetime(timestamp(2021-11-29T00:00:00.000Z))
我正在尝试解析 ISO 日期 8601 格式的时间戳。
示例:2021-04-10T14:11:00Z
此信息存储在 JSON 对象中,因此我将该数据提取为字符串:
我正在寻找的格式是 yy-MM-dd hh:mm 格式,为此我尝试了以下格式
SQL 代码
SELECT document_id,
json_extract(data, '$.Pair') as pair,
PARSE_TIMESTAMP('%y-%m-%d %H:%M', json_extract(data, '$.AlertTime')) as alerttime,
COUNT(document_id) as alert_count
FROM `tradingview-alerts-26eb8.alltables.TradingView_000_raw_latest` as alert_view
GROUP BY alerttime, document_id, pair
错误
上面的代码导致以下错误:
Failed to parse input string '"2021-04-10T03:17:00Z"
原因是日期中间的T,我相信,
为了放弃我尝试了这个改变:
SUBSTR(json_extract(data, '$.AlertTime'), 1, 10))
但是我在另一行收到错误消息:
Failed to parse input string '"2021-04-1'
我想知道是不是因为日期的显示方式(年-月-日)没有两位数?例如 2021-04-01 而不是 2021-04-1.
但是如果我尝试
SUBSTR(json_extract(data, '$.AlertTime'), 1, 11))
我得到的错误是
Failed to parse input string '"2021-04-10'
您需要将这些 ISO 符号作为常量包含到格式说明符中:
select parse_timestamp('%FT%TZ', '2021-04-12T17:38:10Z')
| f0_ |
---------------------------
| 2021-04-12 17:38:10 UTC |
UPD:如果你有小数秒,你可以包含可选的毫秒元素 %E*S
而不是时间元素 %T
。对于非 UTC 时间戳,还应该有时区元素:%Ez
。因此,可能的解决方案可能是:
with a as (
select '2021-04-12T20:44:06.95841Z' as ts_str union all
select '2021-04-12T23:44:07.83738+03:00' union all
select '2021-04-12T23:44:08+03:00'
)
select parse_timestamp('%FT%H:%M:%E*S%Ez', regexp_replace(ts_str, 'Z$', '+00:00')) as ts
from a
| ts |
|--------------------------------|
| 2021-04-12 20:44:06.958410 UTC |
| 2021-04-12 20:44:07.837380 UTC |
| 2021-04-12 20:44:08 UTC |
我认为你可以使用 timestamp => datetime func。
像这样
datetime(timestamp(2021-11-29T00:00:00.000Z))