如何将 TIMESTAMP WITH TIMEZONE 转换为 TIMESTAMP 但将当地时间保持在 SQL

how to convert TIMESTAMP WITH TIMEZONE to TIMESTAMP but keeping local time in SQL

我想知道如何在 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。

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

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

请注意,这会更改列中值的含义。带时区的时间戳实际上是一个 UTC 值,为了显示目的 偏移 。我一般不建议这样做。但是当当地时间被移动到数据库中的“timestamp with timezone”值时,我不得不做类似的操作——但是在错误的时区。

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