我在印度的系统上安装了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)