在选择列表中选择两次GETDATE()函数 - 两者的值相同?

时间:2010-10-29 22:28:14

标签: sql-server-2005 getdate

我有一个SELECT语句,它使用GETDATE()来表示两个不同的列值。我想知道,在同一个SELECT中,两个单独的函数调用的性质是否每次都会返回相同的值?

4 个答案:

答案 0 :(得分:10)

不保证每次都会返回相同的值。对GetDate()的每个单独引用都是运行时常量,并将在整个查询中保持其值...

SELECT GETDATE()
FROM large_table
无论查询运行多长时间,

都会在所有行中返回相同的值。

但不能保证不同的引用具有相同的值。

您可以在下面看到

SET NOCOUNT ON;

DECLARE @T TABLE 
(
rownum INT IDENTITY(1,1) PRIMARY KEY,
d1 DATETIME,
d2 DATETIME
)

WHILE (5 > (SELECT COUNT(*) FROM @T WHERE d1 <> d2))
    BEGIN
    DELETE FROM @T WHERE d1 = d2
    INSERT INTO @T 
    SELECT GETDATE(),GETDATE()
    END

SELECT * FROM @T

示例结果

rownum      d1                      d2
----------- ----------------------- -----------------------
22381       2011-05-18 12:24:14.433 2011-05-18 12:24:14.437
30912       2011-05-18 12:24:15.420 2011-05-18 12:24:15.423
43234       2011-05-18 12:24:16.717 2011-05-18 12:24:16.720
113360      2011-05-18 12:24:24.210 2011-05-18 12:24:24.213
147855      2011-05-18 12:24:27.817 2011-05-18 12:24:27.820

答案 1 :(得分:6)

很抱歉这么说,但我刚刚做了一个测试,表明它不会总是返回相同的值。它实际上会被评估两次,如果系统时钟在这两次评估之间的时间内翻转,那么两次调用之间的时间可能略有不同。

然而,其他人说的是每行不会评估一次:每列只评估一次。

请参阅Will GETUTCDATE() return the same value if used twice in the same statement?

答案 2 :(得分:1)

大多数系统函数都是按查询计算的,而不是按行计算,除了那些按照定义统计唯一的那些(如NEWID())。这包括像RAND()(它不是唯一的,只有伪随机)之类的东西,除非用NEWD()随机逐行播种。

决定论与此评估无关,因为它意味着“输出对于任何给定的输入都是相同的,例如语言或DMY / MDY”

这个“每次查询一次”评估当然有道理,特别是对于GETDATE()。

如果我进行10k行更新,我希望每一行都具有相同的GETDATE()值。整个更新可以很容易地采取&gt; 3.33毫秒,我不希望在我的10k行上有不同的值。

答案 3 :(得分:0)

是的,他们将返回相同的日期和时间,到毫秒。

SELECT GETDATE(), GETDATE()

返回

2010-10-29 15:34:06.353 2010-10-29 15:34:06.353

我已经用4000 GETDATE()对它进行了测试,它们都返回了相同的颜色。