Подтвердить что ты не робот

Выбор функции GETDATE() дважды в списке выбора - одинаковое значение для обоих?

У меня есть инструкция SELECT, которая использует GETDATE() для двух разных значений столбца. Мне интересно, если по характеру вещей эти два отдельных вызова функций в одном и том же SELECT будут возвращать одинаковые значения каждый раз?

4b9b3361

Ответ 1

Тестирование с 4000 getdate() не доказывает, что это никогда не произойдет.

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

Извините, что сказал, но я только что придумал тест, чтобы показать, что он не всегда будет возвращать одно и то же значение. На самом деле это выполняется дважды, и если системные часы перевернутся в течение времени между этими двумя оценками, вы можете получить несколько разное время из двух вызовов.

Однако другие правы, говоря, что он не будет оцениваться один раз за строку: только один раз за столбец.

См. Будет ли GETUTCDATE() возвращать одно и то же значение, если он используется дважды в том же самом выражении?

Ответ 3

Да, они возвратят те же дату и время на миллисекунду.

SELECT GETDATE(), GETDATE()

Возвращает

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

Я тестировал это с помощью 4000, GETDATE(), и все они возвращаются.

Ответ 4

Большинство системных функций оцениваются по запросу, а не по каждой строке, кроме тех, которые по определению являются статистически уникальными, например NEWID(). Это включает в себя такие вещи, как RAND() (который не уникален, а только psuedo random), если только не посеять случайным образом по строке с помощью NEWD().

Детерминизм не связан с этой оценкой, потому что это означает, что вывод одинаковый для любого заданного входа, независимо от языка, или DMY/MDY)

Эта оценка "один раз за запрос" имеет смысл, конечно, особенно для GETDATE().

Если я обновляю строку 10k, я хочу, чтобы каждая строка имела одно и то же значение GETDATE(). Все обновление может легко занять > 3,33 миллисекунды, и мне не нужны разные значения по моим 10k строкам.