2 つの異なる列の値を使用するSELECT
ステートメントがあります。物事の性質上、これらの 2 つの別々の関数呼び出しが同じで毎回同じ値を返すGETDATE()
のではないかと思っています。SELECT
4 に答える
いいえ、毎回同じ値を返すことが保証されているわけではありません。への個々の参照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
申し訳ありませんが、常に同じ値を返すとは限らないことを示すテストを思いつきました。実際には 2 回評価されます。2 回の評価の間にシステム クロックが反転した場合、2 回の呼び出しでわずかに異なる時間が得られる可能性があります。
ただし、他の人は、行ごとに1回評価されるのではなく、列ごとに1回だけ評価されると言っています。
ほとんどのシステム関数は、行ごとではなく、クエリごとに評価されますNEWID()
。これにはRAND()
、行ごとにNEWID()
.
決定論はこの評価とは関係ありません。これは、「出力は、言語や DMY/MDY に関係なく、任意の入力に対して同じである」ことを意味するためです)。
この「クエリごとに 1 回」の評価は、特にGETDATE()
.
10,000 行の更新を行う場合、すべての行が同じGETDATE()
値になるようにします。更新全体は簡単に 3.33 ミリ秒以上かかる可能性があり、10,000 行にわたって異なる値は必要ありません。
はい、同じ日付と時刻をミリ秒単位で返します。
SELECT GETDATE(), GETDATE()
戻り値
2010-10-29 15:34:06.353 2010-10-29 15:34:06.353
これを 4000 でテストしたGETDATE()
ところ、すべて同じ結果が返されました。