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))