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 和 旧版 SQL 对TIMESTAMP
数据类型。事实上,标准 SQL 具有更严格的有效 TIMESTAMP
值范围,即 253402300799999999
最大值和 -62135596800000000
最小值(考虑到您的值,6328502092800000000
高于允许的最大值)。
作为参考,这里有两种 SQL 语言的 TIMESTAMP
定义:
TIMESTAMP
在 BigQuery Standard SQL
TIMESTAMP
在 BigQuery Legacy SQL
从 Legacy SQL 到 Standrad SQL 的迁移指南为您提供了一个不错的 guide on how to correct the invalid timestamp value
errors。建议的主要两种方法如下所示,但请访问文档以获取有关每种方法的详细信息:
- 使用 UDF 过滤无效时间戳。
- 将
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 日的时间戳 - 如果您希望存储未来的日期,这可能是您想要的。或者,可能是我们有错误的纪元(换句话说,也许您是从不同的起点计算纳秒?)。在这种情况下,您需要确定正确的纪元(这取决于数据的来源!)。
我们在 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 和 旧版 SQL 对TIMESTAMP
数据类型。事实上,标准 SQL 具有更严格的有效 TIMESTAMP
值范围,即 253402300799999999
最大值和 -62135596800000000
最小值(考虑到您的值,6328502092800000000
高于允许的最大值)。
作为参考,这里有两种 SQL 语言的 TIMESTAMP
定义:
TIMESTAMP
在 BigQuery Standard SQLTIMESTAMP
在 BigQuery Legacy SQL
从 Legacy SQL 到 Standrad SQL 的迁移指南为您提供了一个不错的 guide on how to correct the invalid timestamp value
errors。建议的主要两种方法如下所示,但请访问文档以获取有关每种方法的详细信息:
- 使用 UDF 过滤无效时间戳。
- 将
SAFE_CAST
与时间戳列一起使用,以便 returnNULL
值而不是错误。
这意味着存储在您的 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 日的时间戳 - 如果您希望存储未来的日期,这可能是您想要的。或者,可能是我们有错误的纪元(换句话说,也许您是从不同的起点计算纳秒?)。在这种情况下,您需要确定正确的纪元(这取决于数据的来源!)。