【问题标题】:CAST as TIMESTAMP not working for some string formatsCAST as TIMESTAMP 不适用于某些字符串格式
【发布时间】:2019-06-14 20:46:01
【问题描述】:

我在 BigQuery 表中有一个字段,它是一个字符串,但实际上是一个时间戳,格式为“2019-06-14T11:31:07”。所以我使用 CAST(sign_up_date AS TIMESTAMP) 转换为可用的 TIMESTAMP。

这在旧版 SQL 中完美运行,但是在标准 SQL 中,当 STRING 的格式为“2019-06-14T09:09”(准确的分钟,缺少“:00”)或“ 2019-05-25T05:31:22.7263555"(有时它们会以十进制秒数表示)。

知道如何让它在标准 SQL 中工作吗?显然我可以只使用 Legacy SQL,但我想用 Standard 编写,因为在该 SQL 中还有其他更好的函数。

谢谢,

本吉

【问题讨论】:

  • 使用parse_timestamp() 而不是cast()
  • 感谢 Gordon,但这不适用于所有数据类型,因为其中一些与上面不完全相同,因此表示无法解析“2016-08-15 13:23: 00”或“2016-08-15 13:23:00+00”。有什么想法吗?

标签: sql google-bigquery


【解决方案1】:

以下是 BigQuery 标准 SQL 的示例

#standardSQL
WITH `project.dataset.table` AS (
  SELECT "2019-06-14T11:31:07" sign_up_date UNION ALL
  SELECT "2019-05-25T05:31:22.7263555" UNION ALL
  SELECT "2019-06-14T09:09"
)
SELECT sign_up_date, 
  COALESCE(
    SAFE.PARSE_TIMESTAMP('%FT%R', sign_up_date),
    SAFE.PARSE_TIMESTAMP('%FT%R:%E*S', sign_up_date)  
  ) AS sign_up_date_as_timestamp  
FROM `project.dataset.table`   

结果

Row sign_up_date                sign_up_date_as_timestamp    
1   2019-06-14T11:31:07         2019-06-14 11:31:07 UTC  
2   2019-05-25T05:31:22.7263555 2019-05-25 05:31:22.726355 UTC   
3   2019-06-14T09:09            2019-06-14 09:09:00 UTC    

如您所见,这将涵盖您在问题中提出的所有三种模式。
如果您能找到更多信息 - 您可以在 COALESCE 中添加相应的 SAFE.PARSE_TIMESTAMP

【讨论】:

    猜你喜欢
    • 2015-10-17
    • 1970-01-01
    • 2017-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-01
    • 2016-07-16
    相关资源
    最近更新 更多