我看过其他类似的帖子并且不确定他们是否会这么做 - 也许他们会这样做,对不起,如果我错过任何可以解答这一点的话。
我有一个字符串
"2017-06-16T10:34:57.705+01:00"
如何将其转换为'时间戳'从字符串中键入,但保留精度(毫秒)和时区偏移量?
TIMESTAMP("2017-06-16T10:34:57.705+01:00")
转换为UTC格式的时间戳并且丢失毫秒精度,我想要一个时间戳类型但保留本地日期与时区的所有精确度?
FORMAT_TIMESTAMP("%Y-%m-%dT%H:%M:%E*S%Ez",PARSE_TIMESTAMP("%Y-%m-%dT%H:%M:%E*S%Ez", "2017-06-16T10:34:57.705+01:00"),"Europe/London")
这保留了精确度并且有偏移但是是一个字符串 - 然后我失去了这个尝试再次转换为时间戳TIMESTAMP(x)!
我觉得我在圈子里转转任何帮助表示感谢!
干杯
答案 0 :(得分:1)
TIMESTAMP
类型是相对于UNIX纪元的某个时间点。它具有微秒精度并且不编码时区,尽管TIMESTAMP
相关函数默认使用UTC,例如用于提取DATE
。
目前尚不清楚为什么要保留时间戳的原始时区,但您可以做的一件事就是保留一个带有UTC偏移量的整数列,您可以使用{{1}来计算输入时间戳之间忽略字符串中的时区和输入时间戳使用字符串中的时区。
对于精度,您可以检查提供的时间戳与TIMESTAMP_DIFF
的结果之间是否相等,例如TIMESTAMP_TRUNC
看看精度是多少。我不知道你想对这些信息做什么,但你也可以使用字符串或整数表示精度。
答案 1 :(得分:1)
作为补充,当您应用PARSE_TIMESTAMP
时,实际上并没有失去精确度,因为您可以使用UNIX_MILLIS
函数进行检查:
WITH data AS(
SELECT "2017-06-16T10:34:57.705+01:00" as date union all
SELECT "2017-06-16T10:34:57.999+01:00" as date
)
SELECT
date,
UNIX_MILLIS(PARSE_TIMESTAMP("%Y-%m-%dT%H:%M:%E*S%Ez", date, "Europe/London")) millis_date
FROM data
结果:
Row date millis_date
1 2017-06-16T10:34:57.999+01:00 1497605697999
2 2017-06-16T10:34:57.705+01:00 1497605697705