Postgresql now()返回不正确的值

时间:2015-10-09 19:32:34

标签: postgresql

我有两个postgresql服务器 - 一个在我的Windows机器上运行本地服务器,另一个在beta linux服务器上运行。

我在两者上运行此命令(非常接近同一时间):

select current_setting('TIMEZONE'), now();

本地数据库结果:

"US/Pacific";"2015-10-09 12:29:51.053-07"

Beta DB结果:

"US/Pacific";"2015-10-09 12:23:00.121953-07"

正如您所看到的,时区是相同的,但时间不是 - 本地数据库上的时间是正确的,但测试版服务器上的时间似乎是大约6分51秒。

根据答案编辑:

另外,我检查了两个操作系统上的日期和次数,两者都是正确的。

选择不是大事务的一部分。我正在使用pgAdmin来运行这些语句。另外,我使用now()函数运行timeofday(),它们返回与now()函数调用完全相同的时间。

知道这是怎么回事吗?

3 个答案:

答案 0 :(得分:2)

您确定在两台机器上检查了操作系统上的当前日期/时间吗?看起来他们的时钟不是“同步”......

另外,你在“长时间运行”交易中运行“选择”吗? “now()”函数始终返回事务开始时“冻结”的时间。要在事务中获得运行时间,请使用timeofday()函数。

答案 1 :(得分:1)

PostgreSQL直接调用基础操作系统的日期和时间例程来获取时间戳,仅调整时区(如果需要)和纪元 - 这是固定的。

您的时钟很可能实际上并非在两台主机之间同步。设置网络时间同步。问题将消失。如果您确实非常确定它们,请检查unix系统上date +%H:%M:%S命令的输出,以及Windows命令行上的time /T。它们真的一样吗?

如果他们在PostgreSQL中有所不同,但操作系统报告的情况不同,那么您已经设置了网络时间同步,请向pgsql-bugs报告错误或在此处跟进。但请确保它们真的相同,并确保网络时间同步处于活动状态并正常工作。

答案 2 :(得分:0)

您检查了两台机器上的日期 - 但是您是否也检查了时间?保持时间同步的最佳方法是在所有计算机上使用NTP。此外,如果您不确定事务,可以使用timeofday()来获取当前系统时间。

SELECT timeofday();