【问题标题】:Is NOW() a stable function?NOW() 是一个稳定的函数吗?
【发布时间】:2011-11-08 09:41:49
【问题描述】:

如果我这样做了

INSERT INTO table1 (datetime1, datetime2) VALUES (NOW(),NOW())

两列中的两个字段是否始终相同?

同上

INSERT INTO table1 (datetime1, datetime2) VALUES (NOW(),NOW())
                                                ,(NOW(),NOW()) 

所有四个数据库条目是否都具有相同的值,或者 row1 row2 是否可能?

请注意,这是一个理论问题,而不是 work-around 问题。
我真的很想知道如何以及为什么。

【问题讨论】:

  • 这是什么 RDBMS?它不是通用的。 SQL Server 没有NOW()。但是,如果您对getdate() 的 SQL Server 答案感兴趣,那就是No, they will not always be the same
  • @Martin,非常感谢您的评论,但是我的问题与那个问题略有不同。大多数 SQL 服务器会预先计算在 select/update/insert 语句中使用的函数的结果,以加快查询速度。
  • 是 SQL Server 预先计算函数引用的每个实例。因此,如果您执行SELECT GETDATE(), GETDATE() FROM Table,则无论行数如何,都会调用GETDATE() 函数两次。然而,调用一次并在两列中使用相同的结果似乎没有逻辑。
  • @Martin 谢谢,信息量很大,我想知道因为你可以像这样使用 now() 函数作为盐值:INSERT INTO table1 (who, when, key) VALUES ('user1', now(), SOMESORTOFHASH(CONCAT(NOW(),'secret'))) 如果不匹配,那真的很糟糕!
  • DB2(至少在 iSeries 上)明确将此称为它确实 所做的事情。在 DB2 下,所有值都将共享相同的时钟读数。

标签: sql database-agnostic


【解决方案1】:

使用 Postgres now() 总是返回表示事务开始的时间戳。

因此,对于您的第二个示例,所有四行都将具有相同的时间戳值。

如果你想拥有“真实”的时间戳,你必须使用clock_timestamp()

更多细节在手册中:

http://www.postgresql.org/docs/current/static/functions-datetime.html#FUNCTIONS-DATETIME-CURRENT

【讨论】:

    【解决方案2】:

    如果您的查询不需要很长时间,那么所有值都相同的变化是相当高的。我不会依赖它。更好的方法是先将值放入变量中,然后多次使用该变量。

    【讨论】:

    • 感谢您抽出宝贵时间,IMO 这不是问题的答案。似乎不同数据库之间的答案有所不同,我猜子问题 1 的答案并不总是与子问题 2 的答案相匹配。得到 that 的答案会很有趣。
    【解决方案3】:

    如果你必须让它们都一样,你最好先定义一个 now 变量,然后将所有列设置为那个。

    【讨论】:

    • @Schoedinger,这不是问题的答案!
    • @Johan:实际上,这是一个答案(不,它们可能不一样)也是一种保证值都相同的方法。跨度>
    • @Yuck:这取决于使用的 DBMS。 Postgres 确保对now() 的所有四个调用都返回相同的值
    • 我理解 OP 是在询问他们发布的 SQL 是否在其字段中始终具有相同的值,我对此做出了回应。我意识到还有一个关于我没有解决的功能完整性的问题。
    • @a_horse_with_no_name - 因为 OP 没有提到 postgres,虽然这是对 postgres 的有效评论,但更广泛的答案似乎是有道理的。
    【解决方案4】:
    DECLARE @Timestamp DATETIME
    SELECT @Timestamp = getDate()
    INSERT INTO table1 (datetime1, datetime2) VALUES (@Timestamp, @Timestamp)
    

    如果您想要的话,以上内容将在表中的两个字段中创建相等的值。

    如果您使用的数据库支持 NOW(),并且您想要唯一的日期时间值,您的查询将生成它,尽管时间更改会很短。

    【讨论】:

      【解决方案5】:

      原来已经有一个和你类似的问题,但它是specifically about MySQL

      从理查德的回答如下,NOW() 返回的值在语句执行开始时是固定的,在执行完成之前永远不会改变,这是由文档确认的。与 PostgreSQL 类似,MySQL 中还有另一个函数返回实际时间戳,该时间戳对应于包含该函数的语句的特定部分的评估时间,该函数为 SYSDATE()

      参考资料:

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-07-14
        • 1970-01-01
        • 1970-01-01
        • 2012-08-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多