sql server - मैं किसी विशेष दिन के अंतिम संभावित समय को कैसे प्राप्त करूं?




sql-server date (3)

मैं किसी विशेष दिन के अंतिम संभावित समय को प्राप्त करने की कोशिश कर रहा हूँ जैसे दिनांक 2008-01-23 00: 00: 00.000 की तिथि के लिए 2008-01-23 23: 59: 59.999 की आवश्यकता होगी, खेत?


अगले दिन की शुरुआत में -1 मिलिसेकंड जोड़ें (दिनांकअनु भी नैनोसेकंड का समर्थन करता है, यदि आप वाकई ठीक करना चाहते हैं)।

लेकिन सबसे अधिक संभावना है कि आप एक तुलना में इस मूल्य का उपयोग करना चाहते हैं, और उस स्थिति में यह भी आसान है।

इस तरह से कुछ की तुलना में:

AND @CompareDate <= [LastTimeforThatday]

या यह:

@compareDate BETWEEN [StartDate] AND [LastTimeforThatday]

इसको ऐसे करो:

AND @CompareDate < [BeginningOfNextDay]

या यह:

AND (@CompareDate >= [StartDate] AND @CompareDate < [BeginningOfNextDay])

उत्तर SELECT DATEADD(ms, -3, '2008-01-24') , स्पष्टीकरण नीचे है।

मार्क के ब्लॉग से :

लेकिन रुको, मार्क ... आप ने कहा कि आप के BETWEEN का उपयोग करना चाहते हैं, लेकिन उस क्वेरी में एक नहीं है ... इसका कारण यह है कि BETWEEN में समावेशी है , जिसका अर्थ है अंत-अंक। यदि मेरे पास एक ऐसा आदेश था जो अगले महीने के पहले दिन के मध्यरात्रि में था, तो इसे शामिल किया जाएगा। तो आप अंत की अवधि के लिए उचित मूल्य कैसे प्राप्त करते हैं? यह सबसे निश्चित रूप से किसी एक को इकट्ठा करने के लिए डेट-पार्ट्स का उपयोग नहीं करता है (लेकिन आपको चाहिए, कृपया याद रखें कि यह अधिकतम समय के रूप में 23: 59: 59.9 99 है ... मिलिसेकंड को मत भूलना)। इसे ठीक करने के लिए, हम उन्मादपूर्ण ज्ञान का उपयोग करते हैं कि माइक्रोसॉफ्ट एसक्यूएल सर्वर DATETIME कॉलम में अधिकतम 3 मिलीसेकंड संकल्प होता है (जो कुछ नहीं बदलना है)। तो हम जो भी करते हैं वो सब ऊपर दिए गए किसी भी समाप्ति के सूत्रों से 3 मिलीसेकेंड घटाते हैं। उदाहरण के लिए, कल के अंतिम संभावित क्षण (स्थानीय समय) है:

    SELECT DATEADD(ms, -3, DATEADD(dd, DATEDIFF(dd, 0, GetDate()), 0))

इसलिए इस महीने के दौरान एक BETWEEN क्वेरी के कारण ऑर्डर करने के लिए, आप इसका उपयोग कर सकते हैं:

    SELECT [ID]
    FROM [dbo].[Orders]
    WHERE [ShipDue] BETWEEN DATEADD(mm, DATEDIFF(mm, 0, GetUTCDate()), 0)
    AND DATEADD(ms, -3, DATEADD(mm, DATEDIFF(mm, 0, GetUTCDate()) + 1, 0))

याद रखें, हमेशा सुनिश्चित करें कि आप इनपुट पैरामीटर, नहीं कॉलम के खिलाफ गणित करते हैं, या आप क्वेरी की SARG- योग्यता को मार देंगे, जिसका अर्थ है कि अनुक्रमित उपयोग हो सकते हैं।


इसे वापस क्यों?

SELECT DATEADD(ms, 86399997, *yourDate*)




time