Sql BigQuery:格式化ISO日期
我试图解析一个ISO Date 8601格式的时间戳 示例:Sql BigQuery:格式化ISO日期,sql,google-bigquery,isodate,Sql,Google Bigquery,Isodate,我试图解析一个ISO Date 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'))
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
错误
上面的代码导致以下错误:
无法分析输入字符串“2021-04-10T03:17:00Z”
<> P>这是因为在日期的中期,<强> t <强>,我相信,
为了放弃,我尝试了以下更改:
SUBSTR(json_extract(data, '$.AlertTime'), 1, 10))
但是,我在另一行得到了一个错误:
无法分析输入字符串“2021-04-1”
我想知道这是否是因为日期是如何呈现的(年-月-日),日期没有两位数?例如2021-04-01而不是2021-04-1
但是如果我尝试
SUBSTR(json_extract(data, '$.AlertTime'), 1, 11))
我得到的错误是
无法分析输入字符串“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 |
感谢您的帮助,但有一个问题是,我希望避免显示超出分钟(无秒或时区)的任何内容。为了实现这一点,任何特定的更改?时间戳是一个完整的数据类型,它存储所有部分,而不考虑您的输入。数据显示是另一项任务,因此您可以在应用程序端或在select with
format_timestamp
中应用所需的任何格式。谢谢,它可以用于示例日期,但在我出于某种原因尝试应用于我表中的数据时却不行。@luisalbertodelgadelaflo我添加了更多选项,请检查