17

我有一个用于两个不同列值的SELECT语句。GETDATE()我想知道从本质上讲,这两个单独的函数调用SELECT是否每次都会返回相同的值?

4

4 回答 4

16

不,它们不能保证每次都返回相同的值。每个单独的引用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
于 2011-05-18T11:26:35.773 回答
7

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

但是,其他人说得对,它不会每行评估一次:每列只评估一次。

请参阅如果在同一语句中使用两次,GETUTCDATE() 会返回相同的值吗?

于 2011-05-17T21:01:01.023 回答
1

大多数系统函数是按查询而不是按行评估的,除非那些根据定义在统计上是唯一的,例如NEWID(). 这包括诸如RAND()(这不是唯一的,只有伪随机)之类的东西,除非用NEWID().

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

这种“每次查询一次”评估当然是有意义的,尤其是对于GETDATE().

如果我进行 10k 行更新,我希望每一行都具有相同的GETDATE()值。整个更新可能很容易花费 > 3.33 毫秒,我不希望在我的 10k 行中有不同的值。

于 2010-10-30T09:52:06.983 回答
-2

是的,它们将返回相同的日期和时间,以毫秒为单位。

SELECT GETDATE(), GETDATE()

退货

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

我已经用 4000 测试了这个,GETDATE()它们都返回相同的值。

于 2010-10-29T22:34:29.867 回答