如何将 TIMESTAMP WITH TIMEZONE 转换为 TIMESTAMP 但在 SQL 中保留本地时间

问题描述 投票:0回答:3

我想知道如何在 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 presto trino
3个回答
2
投票

根据 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

1
投票

嗯。 。 。一种强力方法是转换为字符串,然后再转换回时间戳:

date_parse(format_datetime(datecol, '%Y-%m-%d %H:%i:%s'), '%Y-%m-%d %H:%i:%s')

请注意,这会更改列中值的含义。带时区的时间戳实际上是一个 UTC 值,其偏移用于显示目的。我一般不建议这样做。但是,当当地时间被移入数据库中的“带有时区的时间戳”值时,我不得不执行类似的操作 - 但在错误的时区。


0
投票

我使用以下内容:

from_iso8601_timestamp(substr(to_iso8601(timestamp_with_tz), 1, 19)) as local_timestamp

请注意,如果您也需要保留毫秒,则可能需要调整

length
中的
substr
参数。当使用
19
时,它会持续到几秒。

© www.soinside.com 2019 - 2024. All rights reserved.