【问题标题】:BigQuery Error: Cannot return an invalid timestamp value of 6328502092800000000 microseconds relative to the Unix epochBigQuery 错误:无法返回相对于 Unix 纪元的 6328502092800000000 微秒的无效时间戳值
【发布时间】:2018-08-02 08:27:13
【问题描述】:

我们在 BigQuery 中使用带有标准 SQL 的简单选择查询。

select expiration_date FROM cards

但是,它返回以下错误,

错误:无法返回相对于 Unix 纪元的 6328502092800000000 微秒的无效时间戳值。有效时间戳取值范围为 [0001-01-1 00:00:00, 9999-12-31 23:59:59.999999];

谁能帮我做同样的事情?

【问题讨论】:

  • 哪部分不清楚?该值超出范围(在纪元开始后 200675 年),因此不能表示为四位数的年份日期。我们不知道是谁将它放入您的数据库中。
  • 是的,我们数据库中的那些数据。但是,我们不需要更改,如果我们将使用 Legacy SQL,那么它工作正常。我们如何使用标准查询?

标签: google-bigquery bigquery-standard-sql


【解决方案1】:

您遇到的问题是 Standard SQL 和 Legacy SQL 对 TIMESTAMP 数据类型的定义不同。事实上,标准 SQL 有更严格的有效TIMESTAMP 值范围,253402300799999999 最大值和-62135596800000000 最小值(考虑到您的值,6328502092800000000 高于允许的最大值)。

作为参考,这里有两种 SQL 语言的 TIMESTAMP 定义:

从 Legacy SQL 到 Standrad SQL 的迁移指南为您提供了一个不错的guide on how to correct the invalid timestamp value errors。建议的主要两种方法如下,但请访问文档以获取有关每种方法的详细信息:

  1. 使用 UDF 过滤无效时间戳。
  2. 将SAFE_CAST 与时间戳列一起使用,以返回NULL 值而不是错误。

【讨论】:

    【解决方案2】:

    这意味着存储在 BigQuery 表中的 TIMESTAMP 的数值为 6328502092800000000。

    此数值旨在表示自 Unix 纪元(1970 年 1 月 1 日,00:00)开始以来的微秒数。如果你计算一下,这是一个超过 200,000 年的未来;错误消息告诉您,公元 10,000 年以后的日期不被视为有效。

    查看您的值,在我看来,有些事情可能出了差错,而您实际上代表的是自某个纪元开始以来的 纳秒 - 未修改的值不应该作为TIMESTAMP。这可能是您用于将数据上传到 BigQuery 的客户端库或将数据传递给它的代码的问题。

    如果我们简单地假设您的值是“自 Unix 纪元开始以来的纳秒”,我们会得到 2170 年 7 月 17 日的时间戳 - 如果您希望存储未来的日期,这可能是您想要的。或者,可能是我们有错误的时期(换句话说,也许你是从不同的起点开始计算纳秒?)。在这种情况下,您需要确定正确的纪元(这取决于数据的来源!)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-09-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-07-21
      • 2012-03-10
      相关资源
      最近更新 更多