代码之家  ›  专栏  ›  技术社区  ›  A.A

将Postgres转换为TIMESTAMPTZ

  •  0
  • A.A  · 技术社区  · 3 年前

    PostgreSQL在强制转换时的行为是什么 DATE TIMESTAMP TIMESTAMPTZ 使用哪个时区?

    1. PostgreSQL服务器
    2. 运行查询的客户端(当前会话)
    0 回复  |  直到 3 年前
        1
  •  3
  •   Laurenz Albe    3 年前

    如果你投a date a timestamp ,时区不起作用,因为这两种数据类型都没有时区。生成的时间戳将是一天的开始。

    如果你投 日期 timestamp with time zone ,生成的时间戳将是参数定义的时区中日期的开始 timezone 在您当前的会话中。

    SHOW timezone;
    
       TimeZone    
    ---------------
     Europe/Vienna
    (1 row)
    
    SELECT CAST (DATE '2021-01-15' AS timestamp);
    
          timestamp      
    ---------------------
     2021-01-15 00:00:00
    (1 row)
    
    SELECT CAST (DATE '2021-01-15' AS timestamp with time zone);
    
          timestamptz       
    ------------------------
     2021-01-15 00:00:00+01
    (1 row)
    
        2
  •  1
  •   Stefanov.sm    3 年前

    铸造日期到时间戳将附加时间 00:00:00.0 到目前为止。 将使用当前服务器会话的时区。
    默认情况下,这是Postgresql服务器的时区设置。
    您可以更改当前服务器会话的时区,如下所示:

    set time zone 'Europe/Sofia';
    

    我认为客户的时区没有任何影响。关于这个问题的更多信息 here .

    • 编辑

    正如Adrian Klaver所指出的那样,“在处理时间戳时,最好假设最坏的情况”。因此,最好明确设置会话时区。

        3
  •  1
  •   Ken Kotch    2 年前

    考虑到需要更改列类型的情况 integer (以epoc秒为单位) timzezonetz -> 直接从铸造 整数 timezonetz 这是不可能的。 但你可以这样做:

    ALTER TABLE table_name ALTER COLUMN column_name TYPE timestamptz 
      USING column_name::abstime::timestamptz