NOW()是一个稳定的功能吗?

时间:2011-09-01 13:08:58

标签: sql database-agnostic

如果我这样做

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

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

同上

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

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

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

5 个答案:

答案 0 :(得分:10)

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

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

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

手册中有更多详细信息:

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

答案 1 :(得分:4)

如果您的查询不长,那么所有值相同的变化都非常高。我不会依赖它。更好的方法是首先将值放在变量中,然后多次使用该变量。

答案 2 :(得分:2)

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

答案 3 :(得分:2)

DECLARE @Timestamp DATETIME
SELECT @Timestamp = getDate()
INSERT INTO table1 (datetime1, datetime2) VALUES (@Timestamp, @Timestamp)

如果这是您想要的,上面将在表格的两个字段中创建相等的值。

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

答案 4 :(得分:0)

原来已经出现了类似于你的问题,但问题是specifically about MySQL

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

参考文献: