我有一个SELECT语句,它使用GETDATE()来表示两个不同的列值。我想知道,在同一个SELECT中,两个单独的函数调用的性质是否每次都会返回相同的值?
答案 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()
对它进行了测试,它们都返回了相同的颜色。