【问题标题】:Postgres now() timestamp doesn't change, when script works当脚本工作时,Postgres now() 时间戳不会改变
【发布时间】:2014-06-24 02:21:25
【问题描述】:

我的 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

【问题讨论】:

    标签: php postgresql


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

    【讨论】:

    • 也许值得强调clock_timestamp()
    • Clock_timestamp 和 statement_timestamp 做我想做的事。谢谢!
    • @deceze 非常感谢,我试图更新在我的 plpgsql 过程中的 WHILE..LOOP 中定义的时间戳(包含 now() 的变量)并且它没有更新,所以我的情况永远不会失败(无限循环)。我不知道时间戳与交易相关联。所以我在时间更新后添加了一个“提交”(var_time := now(); commit;),现在一切正常
    猜你喜欢
    • 2022-01-17
    • 1970-01-01
    • 2012-08-14
    • 2018-12-27
    • 2021-02-23
    • 1970-01-01
    • 1970-01-01
    • 2013-01-14
    • 2018-02-05
    相关资源
    最近更新 更多