Postgres now() 时间戳在脚本工作时不会更改

2022-08-30 18:49:07

我的PHP脚本将工作几秒钟,我需要随时从Postgres数据库获取实时时间戳。但是当我从Postgres获取current_timestamp时,它总是返回相同的值。

这是我的示例脚本(使用 DBAL):

    echo "DB:" . $dbal->fetchColumn("select current_timestamp") . PHP_EOL;
    echo "PHP: " . date("Y-m-d H:i:s") . PHP_EOL;
    sleep(3);

    echo "DB:" . $dbal->fetchColumn("select current_timestamp") . PHP_EOL;
    echo "PHP: " . date("Y-m-d H:i:s") . PHP_EOL;
    sleep(3);

    echo "DB:" . $dbal->fetchColumn("select current_timestamp") . PHP_EOL;
    echo "PHP: " . date("Y-m-d H:i:s") . PHP_EOL;

下面是输出:

DB:2014-05-07 11:59:50.118+04
PHP: 2014-05-07 11:59:50

DB:2014-05-07 11:59:50.118+04
PHP: 2014-05-07 11:59:53

DB:2014-05-07 11:59:50.118+04
PHP: 2014-05-07 11:59:56

Postgres 安装在本地计算机上。为什么它总是返回相同的时间?如何获得实时性?

我用了now()函数,有同样的结果。Postgres 版本: 9.3.4 x64.PHP 版本: 5.5.11


答案 1

来自TFM,重点介绍我的:

9.9.4. 当前日期/时间

PostgreSQL提供了许多函数,这些函数返回与当前日期和时间相关的值。这些 SQL 标准函数都基于当前事务的开始时间返回值

CURRENT_DATE
CURRENT_TIME
CURRENT_TIMESTAMP
CURRENT_TIME(precision)
CURRENT_TIMESTAMP(precision)
LOCALTIME
LOCALTIMESTAMP
LOCALTIME(precision)
LOCALTIMESTAMP(precision)

...

由于这些函数返回当前事务的开始时间,因此它们的值在事务期间不会更改。这被认为是一个特征:其目的是允许单个事务具有“当前”时间的一致概念,以便同一事务中的多个修改具有相同的时间戳。

PostgreSQL还提供了返回当前语句的开始时间的函数,以及调用函数时的实际当前时间。非 SQL 标准时间函数的完整列表如下:

transaction_timestamp()
statement_timestamp()
clock_timestamp()
timeofday()
now()

transaction_timestamp()等效于 ,但命名是为了清楚地反映它返回的内容。 返回当前语句的开始时间(更具体地说,从客户端接收最新命令消息的时间)。 并在事务的第一个命令期间返回相同的值,但在后续命令期间可能会有所不同。clock_timestamp() 返回实际的当前时间,因此即使在单个 SQL 命令中,其值也会发生变化。 是一个历史悠久的PostgreSQL函数。与 一样,它返回实际的当前时间,但作为格式化的文本字符串,而不是具有时区值的时间戳。now() 是一个传统的 PostgreSQL,相当于 transaction_timestamp()。CURRENT_TIMESTAMPstatement_timestamp()statement_timestamp()transaction_timestamp()timeofday()clock_timestamp()


答案 2

推荐