Sqlserver
 sql >> डेटाबेस >  >> RDS >> Sqlserver

मिलीसेकंड में GETDATE () और SYSDATETIME () के बीच डेटिफ़ हमेशा अलग क्यों होता है?

वे दो अलग-अलग फ़ंक्शन कॉल हैं जो दो अलग-अलग समय लौटा सकते हैं।

इसके अतिरिक्त GETDATE एक datetime देता है डेटाटाइप जिसमें केवल 3-4 एमएस की सटीकता होती है जबकि SYSDATETIME() एक datetime2(7) देता है डेटा प्रकार।

भले ही दोनों कॉल एक ही समय पर वापस आएं, लेकिन आप उस समस्या को देख सकते हैं जो आप राउंडिंग के कारण अनुभव कर रहे हैं।

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*/

दूसरा उत्तर गलत है कि यदि आप GETDATE() . में स्थानापन्न करते हैं फ़ंक्शन को केवल एक बार कॉल किया जाता है जैसा कि नीचे से प्रदर्शित किया जा सकता है।

WHILE DATEDIFF(ms, GETDATE() , GETDATE()) = 0 
PRINT 'This will not run in an infinite loop'

मेरे विंडोज़ XP डेस्कटॉप पर GETDATE() . के साथ लूप चलाते समय और SYSDATETIME मैं ऐसे परिणाम भी देख सकता हूं जो संकेत करते हैं कि कुछ और भी हो सकता है। शायद एक अलग एपीआई बुला रहा है।

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 

उदाहरण परिणाम नीचे

+-----------------------------+-----------------------------+-----+
|             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 |
+-----------------------------+-----------------------------+-----+

रुचि की पंक्तियाँ हैं

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

यह विसंगति एक गोलाकार समस्या होने के लिए बहुत बड़ी है और दो कार्यों को कॉल करने के बीच देरी के साथ केवल एक समय का मुद्दा नहीं हो सकता क्योंकि समस्या एक से अधिक पंक्तियों पर मौजूद है जो GETDATE है रिपोर्ट 10:16:03.26X जबकि SYSDATETIME रिपोर्ट 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. EF4 - चयनित संग्रहीत कार्यविधि कोई कॉलम नहीं लौटाती है

  2. Microsoft SQL Server 2008 R2 में .csv फ़ाइल आयात करने के लिए अनुशंसित विधि?

  3. SQL सर्वर के साथ LIMIT को कैसे कार्यान्वित करें?

  4. SQL सर्वर प्रबंधन स्टूडियो (SSMS) क्या है?

  5. फ़ाइल का नाम और पूर्ण पथ से पथ पार्स करें