我已经对 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]]
答案 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 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位表示是最好的折衷方案。