17

2 つの異なる列の値を使用するSELECTステートメントがあります。物事の性質上、これらの 2 つの別々の関数呼び出しが同じで毎回同じ値を返す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

申し訳ありませんが、常に同じ値を返すとは限らないことを示すテストを思いつきました。実際には 2 回評価されます。2 回の評価の間にシステム クロックが反転した場合、2 回の呼び出しでわずかに異なる時間が得られる可能性があります。

ただし、他の人は、行ごとに1回評価されるのではなく、列ごとに1回だけ評価されると言っています。

同じステートメントで 2 回使用すると、GETUTCDATE() は同じ値を返しますか? を参照してください。

于 2011-05-17T21:01:01.023 に答える
1

ほとんどのシステム関数は、行ごとではなく、クエリごとに評価されますNEWID()。これにはRAND()、行ごとにNEWID().

決定論はこの評価とは関係ありません。これは、「出力は、言語や DMY/MDY に関係なく、任意の入力に対して同じである」ことを意味するためです)。

この「クエリごとに 1 回」の評価は、特にGETDATE().

10,000 行の更新を行う場合、すべての行が同じGETDATE()値になるようにします。更新全体は簡単に 3.33 ミリ秒以上かかる可能性があり、10,000 行にわたって異なる値は必要ありません。

于 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 に答える