2010-10-29 5 views

Antwort

1

Ja, sie geben das gleiche Datum und die gleiche Uhrzeit in Millisekunden zurück.

SELECT GETDATE(), GETDATE() 

Returns

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

Ich habe dies getestet mit 4000, GETDATE() und sie alle gleich zurück.

+0

Dies ist nicht zuverlässig Verhalten. Siehe meinen Beitrag. – StriplingWarrior

+0

Ja. 4.000 ist nicht hoch genug, um dieses Verhalten zuverlässig zu erkennen, wie meine Antwort zeigt. –

+0

-1, da dies leider nicht korrekt ist, siehe Antwort von @MartinSmith – Oskar

1

Die meisten Systemfunktionen werden pro Abfrage ausgewertet, nicht pro Zeile, außer denen, die per Definition statistisch eindeutig wie NEWID() sind. Dazu gehören Dinge wie RAND() (die nicht eindeutig ist, nur pseudozufällig), es sei denn, sie werden Zeile für Zeile mit NEWD() zufällig gesetzt.

Determinismus ist nicht auf diese Auswertung im Zusammenhang, weil es bedeutet, „die Ausgabe das gleiche für einen bestimmten Eingang ist unabhängig von, sagen wir, Sprache oder DMY/MDY)

Dieses‚einmal pro Abfrage‘Auswertung macht Sinn, natürlich , speziell für GETDATE().

Wenn ich eine 10k Zeilenaktualisierung mache, möchte ich, dass jede Zeile den gleichen Wert von GETDATE() hat.Das gesamte Update könnte leicht> 3,33 Millisekunden dauern und ich möchte keine anderen Werte meine 10k Reihen

+0

Dies wäre eine einmal pro Funktion pro Abfrage, wenn also die Abfrage mehrere Instanzen von GETDATE() enthält, würde jede davon eine verursachen Aufruf der Funktion GETDATE(). – StriplingWarrior

+0

@StriplingWarrior http://sqlfiddle.com/#!6/27bad6/1 sagt anders, und GETDATE() wird einmal pro Abfrage ausgeführt – gbn

+0

Nun, ich bin nicht ganz klar auf die inneren Abläufe des Ausführungsplans. Ich kann völlig sehen, warum Sie erwarten, dass dieses Beispiel die Oberfläche von GETDATE() doppelt ausführt. Ich vermute jedoch, dass es nicht das tut, was Sie erwarten. http://sqlfiddle.com/#!6/27bad6/7/0 zeigt, dass selbst ohne den Verzögerungsaufruf GETDATE() immer wieder mit anderen Werten endet. – StriplingWarrior

5

Entschuldigung, es zu sagen, aber ich kam gerade mit einem Test, um zu zeigen, dass es nicht immer geben Sie den gleichen Wert zurück. Es wird tatsächlich zweimal ausgewertet, und wenn sich die Systemuhr während der Zeit zwischen diesen beiden Auswertungen umkehrt, können Sie leicht unterschiedliche Zeiten für die beiden Aufrufe erhalten.

Die anderen haben jedoch recht, dass es nicht einmal pro Zeile ausgewertet wird: nur einmal pro Spalte.

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

8

Testing mit 4.000 getdate() nicht beweisen, dass es nie passieren kann.

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 

Beispiel Ergebnisse

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