Sql BigQuery:格式化ISO日期

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

我试图解析一个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')) 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我添加了更多选项,请检查