Sqlserver
 sql >> Teknologi Basis Data >  >> RDS >> Sqlserver

Mengapa Dateiff antara GETDATE() dan SYSDATETIME() dalam milidetik selalu berbeda?

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



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Tiga Tren Teratas yang Mempengaruhi DBA yang Bertanggung Jawab untuk Pemantauan SQL Server

  2. Mencari di SQL Management Studio 2005

  3. Kunci pesimistis di T-SQL

  4. Bagaimana menemukan jumlah beberapa kolom dalam sebuah tabel di SQL Server 2005?

  5. Bagaimana cara mengurai VARCHAR yang diteruskan ke prosedur tersimpan di SQL Server?