当我更改系统日期时间时,亚洲/ kolkata中的Postgresql current_time标记会发生变化

时间:2016-04-22 05:08:10

标签: sql postgresql timezone

我的系统上安装了Postgresql,位于印度,因此时区出现在Asia/kolkata

我需要的是current_timestamp所以我尝试了以下查询:

select now()

select current_timestamp AT TIME ZONE 'Asia/Kolkata'

这显然给了我正确的时间戳。

但是,如果我更改系统日期或时间,然后我使用此查询,那么它会给我更改日期时间的结果。这显然是错误的。

如何查询或更改必要的配置文件,使时间戳应始终正确地显示为 Asia / Kolkata,哪些应该与系统日期时间相关。

Postgresql版本:9.3

1 个答案:

答案 0 :(得分:1)

您无法单独使用PostgreSQL,now()current_timestamp取决于系统日期。基本上,服务器上运行的所有内容都基于系统日期。

您必须确保系统日期准确(ntp同步)或使用外部服务。

以下是一种仅使用SQL请求外部时间的方法,但它远非有效甚至非常准确:

CREATE OR REPLACE FUNCTION external_now() RETURNS TIMESTAMP WITH TIME ZONE AS $$
    DECLARE last_external_now TIMESTAMP WITH TIME ZONE := null;
    BEGIN
        CREATE TEMPORARY TABLE external_now (
            now text
        );

        COPY external_now
        FROM PROGRAM 'curl -s http://www.timeapi.org/utc/now -w "\n"';

        SELECT CAST(now AS TIMESTAMP WITH TIME ZONE)
        FROM external_now
        ORDER BY now DESC
        LIMIT 1
        INTO last_external_now;

        DROP TABLE external_now;

        return last_external_now;
    END;
$$ LANGUAGE plpgsql 
    VOLATILE 
    -- allow non superuser to call this function 
    SECURITY DEFINER
    COST 100000
;

您必须以超级用户身份创建此功能,但您可以像任何人一样运行它:

test=> select external_now();
      external_now
------------------------
 2016-04-26 07:00:17+00
(1 row)

test=> select external_now() AT TIME ZONE 'Asia/Kolkata';
      timezone
---------------------
 2016-04-26 12:30:21
(1 row)