我想知道如何在 SQL 中完成这样的转换,例如
2020-07-03 19:47:51.494 America/Los_Angeles
=> 2020-07-03 19:47:51.494
注意输入数据类型
TIMESTAMP WITH TIMEZONE
,输出类型为 TIMESTAMP
。
特别是,我使用来自 https://prestosql.io/.
的 prestosql根据 SQL 标准,
CAST
应该这样做。
在 Presto 中,在默认设置下,现在情况并非如此。
这是由 https://github.com/prestosql/presto/issues/37 跟踪的
但是,您可以通过会话切换来解锁 SQL 标准行为
presto> SET SESSION legacy_timestamp = false;
SET SESSION
presto> SELECT CAST(TIMESTAMP '2020-07-03 19:47:51.494 America/Los_Angeles' AS timestamp);
_col0
-------------------------
2020-07-03 19:47:51.494
嗯。 。 。一种强力方法是转换为字符串,然后再转换回时间戳:
date_parse(format_datetime(datecol, '%Y-%m-%d %H:%i:%s'), '%Y-%m-%d %H:%i:%s')
请注意,这会更改列中值的含义。带时区的时间戳实际上是一个 UTC 值,其偏移用于显示目的。我一般不建议这样做。但是,当当地时间被移入数据库中的“带有时区的时间戳”值时,我不得不执行类似的操作 - 但在错误的时区。
我使用以下内容:
from_iso8601_timestamp(substr(to_iso8601(timestamp_with_tz), 1, 19)) as local_timestamp
请注意,如果您也需要保留毫秒,则可能需要调整
length
中的 substr
参数。当使用19
时,它会持续到几秒。