Sql server 2005 在选择列表中选择GETDATE()函数两次——两者的值相同吗?

Sql server 2005 在选择列表中选择GETDATE()函数两次——两者的值相同吗?,sql-server-2005,getdate,Sql Server 2005,Getdate,我有一个SELECT语句,它对两个不同的列值使用GETDATE()。我想知道,根据事物的性质,在同一个SELECT中的两个单独的函数调用是否每次都返回相同的值?是的,它们将返回相同的日期和时间,以毫秒为单位 SELECT GETDATE(), GETDATE() 返回 2010-10-29 15:34:06.353 2010-10-29 15:34:06.353 我已经用4000,GETDATE()对此进行了测试,它们都返回相同的结果。大多数系统函数都是按查询计算的,而不是按行计算的,除了那

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

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

SELECT GETDATE(), GETDATE()
返回

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

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

大多数系统函数都是按查询计算的,而不是按行计算的,除了那些根据定义在统计上唯一的函数,例如
NEWID()
。这包括像
RAND()
(这不是唯一的,只是psuedo random),除非使用
NEWID()一行一行地随机播种

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

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


如果我执行10k行更新,我希望每一行都具有相同的
GETDATE()
value。整个更新过程可能需要>3.33毫秒,我不希望在我的10k行上有不同的值。

很抱歉,但我刚刚做了一个测试,表明它不会总是返回相同的值。它实际上会被评估两次,如果系统时钟在这两次更新之间发生翻转评估后,两次通话的时间可能略有不同

然而,其他人说得对,它不会每行计算一次:每列只计算一次


请参见

否它们不保证每次返回相同的值。对
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

这是不可靠的行为。请参阅my post.Yep。4000不够高,无法可靠地看到我的答案显示的这种行为。-1由于这是不幸的错误,请参阅@MartinSmith的答案。这将是每个查询的每个函数一次,因此如果查询有多个GETDATE()实例其中,每一个都会导致调用GETDATE()函数。@StriplingWarrior则相反,并且GETDATE()会在每个查询中运行一次。我不完全清楚执行计划的内部工作方式。我完全明白为什么您希望该示例出现GETDATE()执行两次。但是,我猜它并没有达到您预期的效果。这表明,即使没有延迟调用,GETDATE()也会经常以不同的值结束。
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