【发布时间】:2020-12-30 08:15:03
【问题描述】:
我想知道如何在 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 中进行这种转换,例如
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 值,出于显示目的而偏移。我一般不建议这样做。但是当本地时间被移动到数据库中的“带有时区的时间戳”值时,我不得不做类似的操作——但是在错误的时区。
【讨论】: