BigQuery Error: Cannot return an invalid timestamp value of 6328502092800000000 microseconds relative to the Unix epoch

BigQuery Error: Cannot return an invalid timestamp value of 6328502092800000000 microseconds relative to the Unix epoch

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

select expiration_date FROM cards

但是,它 return 是一个下面的错误,

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

谁能帮我做同样的事情?

您遇到的问题是 标准 SQL旧版 SQLTIMESTAMP 数据类型。事实上,标准 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 与时间戳列一起使用,以便 return NULL 值而不是错误。

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

此数值旨在表示自 Unix 纪元(1970 年 1 月 1 日,00:00)开始以来的微秒数。如果你计算一下,这是未来20万年以上的日期;错误消息告诉您日期从 10,000 A.D 年开始。以后被认为无效。

看看你的价值,在我看来可能出了点问题,你实际上代表了 纳秒 自某个时代开始以来 - 未修改的价值不应该是作为 TIMESTAMP 上传到 BigQuery。这可能是您用于将数据上传到 BigQuery 的客户端库或向其传递数据的代码的错误。

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