暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

postgresql NOW()会返回时区信息

yanzongshuaiDBA 2021-03-18
4528

Getting NOW() in your preferred timezone

执行NOW()函数获取当前时间时,可以获得日期和服务器所在的时区。很多服务器运行在UTC/GMT,如果用户也使用UTC/TMT,一切都会正常,但是一旦出现时区不匹配(无论是用户程序还是数据库服务或者其他方面),就会出错。因此需要指定。

NOW()返回带有时区的时间戳,但是如果使用timestamp[without timezone]列时,然后通过NOW()向这个列插入时,时区信息会自动删除

    =# create table test
    (a int primary key, b timestamp withouttime zone);


    =# select now(),pg_typeof(now());
                    now            |     pg_typeof   
    -------------------------------+--------------------------
     2020-05-06 16:44:03.917735-07 | timestamp withtime zone
    (1 row)


    =# insert into testvalues
    (1, '2020-05-06 16:44:03.917735-07');


    =# select * fromtest;
     a |         b        
    ---+----------------------------
     1 | 2020-05-06 16:44:03.917735
    (1 row)


    =# show timezone;
      TimeZone
    ------------
    US/Pacific

    我们可以看到列“b”中值没有了时区信息。这意味着存储的结果值是错误的,因为它不遵循用户将时间戳值作为UTC值的意向。我们可以通过now() at time one ‘utc’进行补救:

      =# insert into test values
      (2, (now() at time zone 'utc'));


      =# select * fromtest;
       a |         b        
      ---+----------------------------
       1 | 2020-06-10 19:38:22.859175
      (1 row)

      原文

      https://postgresweekly.com/issues/368


      最后修改时间:2021-03-18 23:58:40
      文章转载自yanzongshuaiDBA,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

      评论