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

时间:2014-05-07 08:06:19

标签: php postgresql

我的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 个答案:

答案 0 :(得分:19)

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