BigQuery在其任何日期时间数据类型中是否支持纳秒?

时间:2017-06-01 08:45:54

标签: google-bigquery

我已经对 DATETIME TIMESTAMP 数据类型进行了一些研究,我知道它们支持以毫秒和微秒表示的日期时间

如下所示,

YYYY-[M]M-[D]D[( |T)[H]H:[M]M:[S]S[.DDDDDD]]

但是,是否可以加载/表示具有纳秒精度的值?

YYYY-[M]M-[D]D[( |T)[H]H:[M]M:[S]S[.DDDDDDDDD]]

2 个答案:

答案 0 :(得分:3)

实际上,BigQuery支持高达微秒的精度,而不仅仅是毫秒。

不,我不相信它支持纳秒精度(也许Google员工会在那里纠正我),我当然看不到docs中的任何内容。但是,这说明了:

  

如果string_expression无效,则会产生错误   超过六个亚秒数字(即精度大于微秒),   或表示超出支持的时间戳范围的时间。

因此,这将起作用:

SELECT CAST('2017-01-01 00:00:00.000000' AS TIMESTAMP)

但是这不会(“无法投射文字”2017-01-01 00:00:00.000000000“来输入TIMESTAMP”):

SELECT CAST('2017-01-01 00:00:00.000000000' AS TIMESTAMP)

答案 1 :(得分:1)

有关时间戳精度的更多上下文,请考虑supported range of BigQuery timestamps0001-01-01 00:00:00.0000009999-12-31 23:59:59.999999。使用微秒精度,如果您将时间戳锚定到Unix纪元,这意味着您可以使用整数值-62135596800000000表示此范围的开头,并使用253402300799999999表示结尾(这些是您获得的值)如果您将UNIX_MICROS函数应用于上述时间戳。)

现在假设我们想要纳秒精度,但我们仍然希望能够将时间戳表示为相对于Unix纪元的整数。最小和最大时间戳将表示为-62135596800000000000253402300799999999。但是,查看int64的范围,我们需要更宽的整数类型,因为int64的最小值和最大值是-92233720368547758089223372036854775807。或者,我们需要将时间戳的范围限制为大约1677-09-21 00:12:432262-04-11 23:47:16,假设我正确地进行了数学计算。鉴于纳秒精度通常没那么有用,具有更宽的时间范围,同时仍然能够使用64位表示是最好的折衷方案。