【问题标题】:SQL to Reformat Timestamp FieldSQL 重新格式化时间戳字段
【发布时间】:2019-06-18 09:55:54
【问题描述】:

我正在使用 Java 和 SQL 在 BigQuery 中查询表。我想实现以下目标:

  • 拉表
  • 将字符串(例如 2018 年 1 月 8 日)重新格式化为时间戳(例如 2018-01-08 23:59:28 UTC)
  • 将所有新数据推回新表或现有表中

目前,我正在成功拉表:

QueryJobConfiguration queryConfig =
            QueryJobConfiguration.newBuilder(
                    "SELECT *"
                      + "FROM `MyTable` "
                      + "LIMIT 10")
                    .setUseLegacySql(false)
                    .build();

是否可以包含一条 SQL 更新语句,该语句采用现有的字符串时间字段并将其重新格式化以匹配时间戳格式?我知道初始时间字符串不包含足够的信息来成为时间戳。我可以将缺失值设为 0(例如 00:00:00 UTC)

【问题讨论】:

  • 该字段中的所有值都遵循 Jan 08 2018 格式。一旦弄清楚这一点,我确实打算将来将相同的逻辑应用于其他领域。

标签: sql google-bigquery


【解决方案1】:

是否可以包含一条 SQL 更新语句,该语句采用现有的字符串时间字段并将其重新格式化以匹配时间戳格式?

请参阅下面的 BigQuery 标准 SQL 示例

#standardSQL
WITH `project.dataset.table` AS (
  SELECT 'Jan 08 2018' AS date_as_string
)
SELECT date_as_string, PARSE_TIMESTAMP('%b %d %Y', date_as_string) date_as_timestamp
FROM `project.dataset.table`   

结果

Row date_as_string  date_as_timestamp    
1   Jan 08 2018     2018-01-08 00:00:00 UTC  

【讨论】:

  • 当我尝试这样做时出现语法错误:意外的字符串文字 'myTable` AS ( ...'。我的代码是:"WITH 'myTable`" + "AS (SELECT time AS dateS) " + "SELECT dataS, PARSE_TIMESTAMP('%b %d %Y', dateS) dateT" + "FROM 'myTable' " + "LIMIT 10") 我似乎无法在评论中格式化,所以如果很难阅读。
  • 在我的示例中我没有看到任何使用 `myTable - 你能澄清一下你正在运行的是什么吗?
  • 哦,我现在明白了 - 检查 myTable 左侧撇号的使用 - 它应该改为勾选
  • 您可以将实际脚本放入您的问题中 - 这样格式就会正确呈现!
  • 仍然 - 您是否能够在 BQ UI 中运行我的答案中的示例?
【解决方案2】:

结合使用 BigQuery 时间戳相关函数 PARSE_TIMESTAMPFORMAT_TIMESTAMP 重新格式化时间戳

【讨论】:

  • 他们不是都需要时间戳作为参数吗?不幸的是,我从一个格式为“MMM dd yyyy”的字符串开始
  • 如果您查看链接中的示例,它们使用字符串,所以您应该没问题
  • 谢谢坎纳潘。你的回答是正确的。 Mikhail 帮助我了解了如何使用它!
猜你喜欢
  • 1970-01-01
  • 2021-12-19
  • 1970-01-01
  • 2011-01-19
  • 2020-01-11
  • 1970-01-01
  • 1970-01-01
  • 2019-02-17
相关资源
最近更新 更多