【问题标题】:how to convert TIMESTAMP WITH TIMEZONE to TIMESTAMP but keeping local time in SQL如何将 TIMESTAMP WITH TIMEZONE 转换为 TIMESTAMP 但在 SQL 中保持本地时间
【发布时间】: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 presto trino


    【解决方案1】:

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

    【讨论】:

    • 是否有推荐的方法在视图后面应用这种行为?
    • 你认为为这样的功能写一个 presto UDF 是个好主意吗?
    • 如果您有新的UDF想法,请打开new issue in Presto project
    【解决方案2】:

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

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

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

    【讨论】:

    • 我正在做类似的事情,也是微秒。但感觉有点尴尬。所以想知道是否有更好的方法,似乎不是
    猜你喜欢
    • 2016-04-21
    • 2011-10-11
    • 1970-01-01
    • 2015-06-18
    • 1970-01-01
    • 2019-01-28
    • 2017-03-19
    • 1970-01-01
    • 2017-05-23
    相关资源
    最近更新 更多