2010-10-29 5 views

Répondre

1

Oui, ils renvoient la même date et heure, à la milliseconde.

SELECT GETDATE(), GETDATE() 

Retours

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

J'ai testé avec 4000, GETDATE() et ils reviennent tous les mêmes.

+0

Ce comportement n'est pas fiable. Voir mon message. – StriplingWarrior

+0

Oui. 4000 n'est pas assez élevé pour voir ce comportement de manière fiable comme le montre ma réponse. –

+0

-1 puisque ce n'est malheureusement pas correct, voir la réponse par @MartinSmith – Oskar

1

La plupart des fonctions système sont évaluées par requête, et non par ligne, sauf celles qui sont par définition statistiquement uniques telles que NEWID(). Cela inclut des choses comme RAND() (qui n'est pas unique, seulement psuedo random) à moins d'être rangées au hasard ligne par ligne avec NEWD().

Déterminisme est pas liée à cette évaluation, car cela signifie « la sortie est la même pour une entrée donnée indépendante de, disons, de langue ou DMY/MDY)

Cette « évaluation une fois par requête » est logique bien sûr , en particulier pour GETDATE()

Si je fais une mise à jour de ligne 10k, je veux que chaque ligne ait la même valeur GETDATE() La mise à jour entière pourrait facilement prendre> 3,33 millisecondes et je ne veux pas de valeurs différentes mes lignes 10k

+0

Ce serait une fois par fonction-par-requête, donc si la requête a plusieurs instances de GETDATE(), chacune d'entre elles provoquerait un invocation de la fonction GETDATE(). – StriplingWarrior

+0

@StriplingWarrior http://sqlfiddle.com/#!6/27bad6/1 dit autrement, et GETDATE() est exécuté une fois par requête – gbn

+0

Eh bien, je ne suis pas entièrement clair sur les rouages ​​internes du plan d'exécution. Je peux totalement voir pourquoi vous vous attendez à ce que GETDATE() soit exécuté deux fois. Cependant, je devine que ça ne fait pas ce que vous attendez. http://sqlfiddle.com/#!6/27bad6/7/0 montre que même sans l'appel de délai, GETDATE() se retrouvera avec des valeurs différentes de temps en temps. – StriplingWarrior

5

Désolé de le dire, mais je viens d'arriver avec un test pour montrer que ce ne sera pas toujours renvoie la même valeur. Il est en fait évalué deux fois, et si l'horloge du système arrive à tourner pendant le temps entre ces deux évaluations, vous pouvez obtenir des temps légèrement différents sur les deux appels. Cependant, les autres ont raison de dire qu'il ne sera pas évalué une fois par rangée: une seule fois par colonne.

Voir Will GETUTCDATE() return the same value if used twice in the same statement?

8

test avec 4000 getdate() ne prouve pas qu'il ne peut jamais arriver.

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 

Exemple Résultats

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 
Questions connexes