美文网首页数据库
有关于PostgreSQL数据库的TIMESTAMPTZ类型数据

有关于PostgreSQL数据库的TIMESTAMPTZ类型数据

作者: 消失黎明 | 来源:发表于2019-06-12 16:09 被阅读14次

    今天在工作中遇到了一个问题,需要将PostgreSQL数据库中的TIMESTAMPTZ数据映射到HANA数据库中,开始我只是知道TIMESTAMP类型的数据,但是对于TIMESTAMPTZ类型的数据并不清楚,后来为了解决这个问题,我到官网上学习了PostgreSQL的使用文档,对TIMESTAMPTZ数据类型进行了学习。

    时间戳介绍

    PostgreSQL 提供两种存储时间戳的数据类型: 不带时区的 TIMESTAMP 和带时区的 TIMESTAMPTZ。

    TIMESTAMP 数据类型可以同时存储日期和时间,但它不存储时区。这意味着,当修改了数据库服务器所在的时区时,它里面存储的值不会改变。

    TIMESTAMPTZ 数据类型在存储日期和时间的同时还能正确处理时区。PostgreSQL 使用 UTC 值来存储 TIMESTAMPTZ 数据。在向 TIMESTAMPTZ 字段插入值的时候,PostgreSQL 会自动将值转换成 UTC 值,并保存到表里。当从一个 TIMESTAMPTZ 字段查询数据的时候,PostgreSQL 会把存储在其中的 UTC 值转换成数据库服务器、用户或当前连接所在的时区。

    TIMESTAMP 和 TIMESTAMPTZ 都使用8字节存储空间。如下所示:

    SELECT
          typname,
          typlen
    FROM
          pg_type
    WHERE
          typname ~ '^timestamp';
    
     typname   | typlen
    -------------+--------
     timestamp   |      8
     timestamptz |      8
    (2 rows)
    

    注意TIMESTAMPTZ并不会存储时区,它只是存储了UTC值,然后和当前时区进行转换。

    时间戳实例

    首先创建一个具有TIMESTAMPTIMESTAMPTZ的表:

    CREATE TABLE timestamp_demo (ts TIMESTAMP, tstz TIMESTAMPTZ);
    

    接下来,将该数据库的时区设置为America/Los_Angeles:

    SET timezone = 'America/Los_Angeles';
    

    顺便说一句,可以使用SHOW TIMEZONE语句来显示当前时区:

    SHOW TIMEZONE;
    
     TimeZone
    ----------------
     Asia/Shang_Hai
    (1 行记录)
    

    然后插入一些示例数据:

    INSERT INTO timestamp_demo (ts, tstz)
    VALUES
     (
     '2016-06-22 19:10:25-07',
     '2016-06-22 19:10:25-07'
     );
    

    最后查询:

    SELECT
     ts
    FROM
     timestampz_demo;
    ______________________________________________
             ts          |          tstz
    ---------------------+------------------------
     2016-06-22 19:10:25 | 2016-06-22 19:10:25-07
    (1 row)
    

    然后把时区设置为America/New_York:

    SET timezone = 'America/New_York';
    

    再查询一次,结果如下:

             ts          |          tstz
    ---------------------+------------------------
     2016-06-22 19:10:25 | 2016-06-22 22:10:25-04
    (1 row)
    

    然后就会发现,TIMESTAMP 类型字段的值不变,而 TIMESTAMPTZ 类型字段的值变成了当前时区下的时间。

    时间戳函数

    获取当前的时间

    可以使用NOW()函数获取当前时间

    SELECT NOW();
    ___________________________
                  now
    -------------------------------
     2018-01-11 16:51:55.706649+08
    (1 row)
    

    或者使用 CURRENT_TIMESTAMP:

    SELECT CURRENT_TIMESTAMP;
    __________________________
    current_timestamp
    -------------------------------
     2018-01-11 16:53:03.874548+08
    
    时区转换
    SELECT CURRENT_TIMESTAMP AS CST,  timezone('America/New_York', CURREN
    T_TIMESTAMP) AS NYT;
    

    结果:

                  cst              |            nyt
    -------------------------------+----------------------------
     2018-01-11 16:58:08.610978+08 | 2018-01-11 03:58:08.610978
    (1 row)
    

    相关文章

      网友评论

        本文标题:有关于PostgreSQL数据库的TIMESTAMPTZ类型数据

        本文链接:https://www.haomeiwen.com/subject/wzplfctx.html