我已经做了一些研究,DATETIME和TIMESTAMP数据类型,据我所知,他们支持毫秒和微秒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]]
我已经做了一些研究,DATETIME和TIMESTAMP数据类型,据我所知,他们支持毫秒和微秒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]]
其实,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)
有关时间戳精度更多的上下文,考虑supported range of BigQuery timestamps,这是0001-01-01 00:00:00.000000
到9999-12-31 23:59:59.999999
。以微秒精度,如果将时间戳固定到Unix纪元,这意味着您可以用整数值-62135596800000000
和结尾253402300799999999
来表示此范围的开始(这些值是您将UNIX_MICROS
函数应用于上面的时间戳)。
现在假设我们想要纳秒精度,但我们仍然希望能够将时间戳表示为相对于Unix纪元的整数。最小和最大时间戳将被表示为-62135596800000000000
和253402300799999999
。不过,看一下int64的范围,我们需要更宽的整数类型,因为int64的最小值和最大值分别是-9223372036854775808
和9223372036854775807
。或者,我们需要将时间戳的范围限制为大约1677-09-21 00:12:43
至2262-04-11 23:47:16
,假设我做了正确的数学计算。考虑到纳秒精度通常不是很有用,具有更广泛的时间戳范围,同时仍能够使用64位表示是最好的折衷方案。
你是对的,TIMESTAMP和DATETIME的精度都达到微秒级。知道OP具有哪种设备可以测量分布式环境中的纳秒精度会很有趣。 –