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

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

Ответы [ 4 ]

10 голосов
/ 18 мая 2011

Нет, они не гарантируют, что будут возвращать одинаковые значения каждый раз. Каждая отдельная ссылка на 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
6 голосов
/ 18 мая 2011

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

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

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

1 голос
/ 30 октября 2010

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

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

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

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

0 голосов
/ 30 октября 2010

Да, они будут возвращать ту же дату и время с точностью до миллисекунды.

SELECT GETDATE(), GETDATE()

Возвращает

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

Я проверил это с 4000, GETDATE(), и все онивернуть то же самое.

...