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

nku*_*hta 10 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;
Run Code Online (Sandbox Code Playgroud)

这是输出:

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
Run Code Online (Sandbox Code Playgroud)

Postgres安装在本地机器上.为什么它总是同时返回?如何获得实时?

我用now()函数,结果相同.Postgres版本:9.3.4 x64.PHP版本:5.5.11

dec*_*eze 28

TFM,突出我的:

9.9.4.当前日期/时间

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

CURRENT_DATE
CURRENT_TIME
CURRENT_TIMESTAMP
CURRENT_TIME(precision)
CURRENT_TIMESTAMP(precision)
LOCALTIME
LOCALTIMESTAMP
LOCALTIME(precision)
LOCALTIMESTAMP(precision)
Run Code Online (Sandbox Code Playgroud)

...

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

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

transaction_timestamp()
statement_timestamp()
clock_timestamp()
timeofday()
now()
Run Code Online (Sandbox Code Playgroud)

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

  • 也许值得强调`clock_timestamp()` (4认同)
  • Clock_timestamp 和 statement_timestamp 做我想要的。谢谢! (3认同)