2017-06-01 68 views
0

我已经做了一些研究,DATETIMETIMESTAMP数据类型,据我所知,他们支持毫秒和微秒BigQuery是否支持其任何日期时间数据类型的纳秒数?

像下面的一个表示日期时间,

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]] 

回答

3

其实,BigQuery支援可达微秒级精度,不仅毫秒。

不,我不相信它支持纳秒精度(也许一个Google员工会纠正我),我当然不能在docs中看到任何东西。然而,这表示:产生

错误如果string_expression是无效的,具有更多的 超过六个亚秒位数(即精度比微秒以上), 或表示所支持的时间戳范围外的时间。

因此,这将工作:

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

但是这不会(“无法施展文字 ”2017年1月1日00:00:00.000000000“ 键入TIMESTAMP”):

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

你是对的,TIMESTAMP和DATETIME的精度都达到微秒级。知道OP具有哪种设备可以测量分布式环境中的纳秒精度会很有趣。 –

1

有关时间戳精度更多的上下文,考虑supported range of BigQuery timestamps,这是0001-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位表示是最好的折衷方案。

相关问题