Postgresql current_time 当我更改系统日期时间时,亚洲/加尔各答的邮票会发生变化



我在印度的系统上安装了Postgresql,所以时区Asia/kolkata

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

select now()
select current_timestamp AT TIME ZONE 'Asia/Kolkata'

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

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

我如何查询或更改必要的 conf 以使时间戳应始终正确显示为亚洲/加尔各答,并且应与系统日期时间相关。

Postgresql 版本:9.3

你不能单独使用 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)

相关内容

  • 没有找到相关文章