bigquery 标准 sql 错误,时间戳无效

Posted

技术标签:

【中文标题】bigquery 标准 sql 错误,时间戳无效【英文标题】:bigquery standard sql error, invalid timestamp 【发布时间】:2016-12-17 06:11:42 【问题描述】:

我正在使用 bigquery 中的一些表,但收到此错误:

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

在legacy sql中查询并升序排序,显示为0001-11-29 22:15:36 UTC

它是如何转化为微秒的?

这是查询:

#standardSQL
SELECT
  birthdate
FROM
  X
WHERE
  birthdate IS NOT NULL
ORDER BY
  birthdate ASC

【问题讨论】:

显示产生错误的查询 更改了细节,现在添加 【参考方案1】:

**strong text**Confirming ,在 BigQuery Legacy SQL 中

SELECT USEC_TO_TIMESTAMP(-62169990264000000)

产生 0001-11-29 22:15:36 UTC 时间戳

而在 BigQuery 标准 SQL 中

SELECT TIMESTAMP_MICROS(-62169990264000000)  

产生错误: TIMESTAMP 值超出允许范围:从 0001-01-01 00:00:00.000000+00 到 9999-12-31 23:59:59.999999+00。

它是如何在微秒内转换的?

时间戳 您可以将 TIMESTAMP 数据类型描述为 UNIX 时间戳或日历日期时间。 BigQuery 在内部将 TIMESTAMP 数据存储为带有 microsecond precision 的 UNIX 时间戳。

查看更多关于TIMESTAMP类型

【讨论】:

【参考方案2】:

0001 年 1 月 1 日的午夜(标准 SQL 中可能的最小时间戳值)相对于 UNIX 纪元为 -62135596800000000(以微秒为单位),大于 -62169990264000000。我没有很好地解释旧版 SQL 与该时间戳值的行为,但您可以在this item on the issue tracker 中阅读有关在标准 SQL 中处理它的一些建议。我们还计划在未来在迁移指南中添加一些关于此时间戳行为的内容。

【讨论】:

以上是关于bigquery 标准 sql 错误,时间戳无效的主要内容,如果未能解决你的问题,请参考以下文章

如何在 BigQuery 标准 SQL 中将时间戳转换为秒

如何在 BigQuery UI 中安排查询时修复“请求包含无效参数”错误

支持标准 SQL 中的视图

Google Bigquery - 查询无效

如何在标准 SQL 中将 Epoch 时间戳转换为日期

BigQuery:如何执行滚动时间戳窗口组计数,每天产生行