Itu adalah dua panggilan fungsi berbeda yang dapat mengembalikan dua waktu berbeda.
Selain itu GETDATE
mengembalikan datetime
tipe data yang hanya memiliki presisi 3-4 ms sedangkan SYSDATETIME()
mengembalikan datetime2(7)
tipe data.
Meskipun kedua panggilan dikembalikan pada waktu yang sama, Anda dapat melihat masalah yang Anda alami karena pembulatan.
DECLARE @D1 DATETIME2 = '2012-08-18 10:08:40.0650000'
DECLARE @D2 DATETIME = @D1 /*Rounded to 2012-08-18 10:08:40.067*/
SELECT DATEDIFF(ms, @D1 , @D2) /*Returns 2*/
Jawaban lainnya salah adalah jika Anda mengganti GETDATE()
fungsi ini hanya dipanggil sekali seperti yang ditunjukkan di bawah ini.
WHILE DATEDIFF(ms, GETDATE() , GETDATE()) = 0
PRINT 'This will not run in an infinite loop'
Saat menjalankan loop di desktop windows XP saya dengan GETDATE()
dan SYSDATETIME
Saya juga dapat melihat hasil yang menunjukkan bahwa sesuatu yang lain mungkin juga terjadi. Mungkin memanggil API yang berbeda.
CREATE TABLE #DT2
(
[D1] [DATETIME2](7),
[D2] [DATETIME2](7)
)
GO
INSERT INTO #DT2
VALUES(Getdate(), Sysdatetime())
GO 100
SELECT DISTINCT [D1],
[D2],
Datediff(MS, [D1], [D2]) AS MS
FROM #DT2
DROP TABLE #DT2
Contoh hasil di bawah
+-----------------------------+-----------------------------+-----+
| D1 | D2 | MS |
+-----------------------------+-----------------------------+-----+
| 2012-08-18 10:16:03.2500000 | 2012-08-18 10:16:03.2501680 | 0 |
| 2012-08-18 10:16:03.2530000 | 2012-08-18 10:16:03.2501680 | -3 |
| 2012-08-18 10:16:03.2570000 | 2012-08-18 10:16:03.2501680 | -7 |
| 2012-08-18 10:16:03.2600000 | 2012-08-18 10:16:03.2501680 | -10 |
| 2012-08-18 10:16:03.2630000 | 2012-08-18 10:16:03.2501680 | -13 |
| 2012-08-18 10:16:03.2630000 | 2012-08-18 10:16:03.2657914 | 2 |
| 2012-08-18 10:16:03.2670000 | 2012-08-18 10:16:03.2657914 | -2 |
| 2012-08-18 10:16:03.2700000 | 2012-08-18 10:16:03.2657914 | -5 |
| 2012-08-18 10:16:03.2730000 | 2012-08-18 10:16:03.2657914 | -8 |
| 2012-08-18 10:16:03.2770000 | 2012-08-18 10:16:03.2657914 | -12 |
| 2012-08-18 10:16:03.2800000 | 2012-08-18 10:16:03.2814148 | 1 |
+-----------------------------+-----------------------------+-----+
Baris yang menarik adalah
| 2012-08-18 10:16:03.2600000 | 2012-08-18 10:16:03.2501680 | -10 |
| 2012-08-18 10:16:03.2630000 | 2012-08-18 10:16:03.2501680 | -13 |
Perbedaan ini terlalu besar untuk menjadi masalah pembulatan dan tidak bisa hanya menjadi masalah waktu dengan penundaan antara memanggil dua fungsi karena masalah ada di lebih dari satu baris yang GETDATE
melaporkan 10:16:03.26X
sedangkan SYSDATETIME
melaporkan 10:16:03.250