我的系统上安装了Postgresql,位于印度,因此时区出现在Asia/kolkata
。
我需要的是current_timestamp所以我尝试了以下查询:
select now()
select current_timestamp AT TIME ZONE 'Asia/Kolkata'
这显然给了我正确的时间戳。
但是,如果我更改系统日期或时间,然后我使用此查询,那么它会给我更改日期时间的结果。这显然是错误的。
如何查询或更改必要的配置文件,使时间戳应始终正确地显示为 Asia / Kolkata,哪些应该与系统日期时间相关。
Postgresql版本:9.3
答案 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)