【问题标题】:Postgresql current_time stamp in Asia/kolkata changes when I change system date time当我更改系统日期时间时,亚洲/加尔各答的 Postgresql current_time stamp 会发生变化
【发布时间】:2016-04-22 05:08:10
【问题描述】:

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

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

select now()

select current_timestamp AT TIME ZONE 'Asia/Kolkata'

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

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

我如何查询或更改必要的配置,以使时间戳始终正确地显示为 Asia/Kolkata,并且应该取决于系统日期时间。

Postgresql 版本:9.3

【问题讨论】:

    标签: sql postgresql timezone


    【解决方案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)
    

    【讨论】:

    • 这是个好建议。在这我必须每次都创建表并删除每次。有没有其他办法?
    • 不知道能不能用纯sql。
    • 收到以下错误:错误:program "curl -s http://www.timeapi.org/utc/now -w "\n"" failed DETAIL: child process exited with exit code 1 CONTEXT: SQL statement "COPY external_now FROM PROGRAM 'curl -s http://www.timeapi.org/utc/now -w "\n"'" PL/pgSQL function external_now() line 8 at SQL statement ********** Error ********** ERROR: program "curl -s http://www.timeapi.org/utc/now -w "\n"" failed SQL state: XX000
    • 你必须找到一个适用于你的操作系统版本的程序,'curl -s timeapi.org/utc/now -w "\n"' 的结果是什么
    • 我正在使用windows 10 OS
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-08-03
    • 2020-10-28
    • 1970-01-01
    • 2020-12-08
    • 2021-10-21
    • 2016-03-17
    • 2021-01-24
    相关资源
    最近更新 更多