DATETIME और DATE की उपेक्षा समय भाग से करें


151

मेरे पास दो टेबल हैं जहां कॉलम [date]टाइप है DATETIME2(0)

मुझे दो रिकॉर्ड की तुलना केवल उनके डेट पार्ट्स (दिन + महीना + साल) से करनी है, टाइम पार्ट्स (घंटे + मिनट + सेकंड) को छोड़ना होगा।

मैं उसे कैसे कर सकता हूँ?

जवाबों:


252

केवल दिनांक भाग की तुलना करने के लिए SQL Server 2008 में CASTनए DATEडेटा प्रकार का उपयोग करें :

IF CAST(DateField1 AS DATE) = CAST(DateField2 AS DATE)

61

मार्क के जवाब में एक छोटी सी खामी यह है कि दोनों डेटफिल्ड को टाइपकास्ट किया गया है, जिसका अर्थ है कि आप किसी भी इंडेक्स का लाभ उठाने में असमर्थ होंगे।

इसलिए, यदि कोई क्वेरी लिखने की आवश्यकता है जो किसी दिनांक फ़ील्ड पर एक सूचकांक से लाभान्वित हो सकती है, तो निम्नलिखित (बल्कि जटिल) दृष्टिकोण आवश्यक है।

  • अनुक्रमित दिनांक फ़ील्ड (इसे DF1 कहते हैं) किसी भी प्रकार के फ़ंक्शन से अछूता होना चाहिए।
  • इसलिए आपको DF1 की तुलना DF1 के दिन के लिए संपूर्ण जीवन काल मूल्यों की पूरी श्रृंखला से करनी होगी।
  • यह DF2 के तारीख-भाग से है, DF2 के बाद के दिन के तारीख-भाग तक।
  • अर्थात (DF1 >= CAST(DF2 AS DATE)) AND (DF1 < DATEADD(dd, 1, CAST(DF2 AS DATE)))
  • नोट : यह बहुत महत्वपूर्ण है कि तुलना > = (समानता की अनुमति) DF2 की तारीख तक है, और (सख्ती से) < DF2 के बाद का दिन। इसके अलावा BETWEEN ऑपरेटर काम नहीं करता है क्योंकि यह दोनों तरफ समानता की अनुमति देता है।

पुनश्च: केवल तारीख (SQL सर्वर के पुराने संस्करणों में) निकालने का एक अन्य तरीका यह है कि कैसे आंतरिक रूप से तिथि का प्रतिनिधित्व किया जाता है।

  • एक नाव के रूप में तारीख डाली।
  • आंशिक भाग को काटें
  • किसी डेटाटाइम पर वापस मान दर्ज करें
  • अर्थात CAST(FLOOR(CAST(DF2 AS FLOAT)) AS DATETIME)

5

हालांकि मैंने उत्तर को सही के रूप में चिह्नित किया। मैं इस पर ठोकर खाने वाले किसी भी व्यक्ति के लिए कुछ चीजों को छूना चाहता था।

सामान्य तौर पर, यदि आप विशेष रूप से दिनांक मानों को अकेले फ़िल्टर कर रहे हैं। Microsoft भाषा के तटस्थ प्रारूप का उपयोग करने की अनुशंसा करता है ymdया y-m-d

ध्यान दें कि प्रपत्र '2007-02-12' केवल डेटा प्रकार DATE, DATETIME2 और DATETIMEOFFSET के लिए भाषा-तटस्थ माना जाता है।

उपरोक्त दृष्टिकोण का उपयोग करते हुए एक तारीख तुलना करना सरल है। निम्नलिखित, विचार किए गए उदाहरण पर विचार करें।

--112 is ISO format 'YYYYMMDD'
declare @filterDate char(8) = CONVERT(char(8), GETDATE(), 112)

select 
    * 
from 
    Sales.Orders
where
    CONVERT(char(8), OrderDate, 112) = @filterDate

एक आदर्श दुनिया में, फ़िल्टर किए गए कॉलम में किसी भी हेरफेर को करने से बचना चाहिए क्योंकि यह SQL सर्वर को कुशलता से अनुक्रमित करने से रोक सकता है। कहा कि, यदि आप जो डेटा स्टोर कर रहे हैं, वह केवल तारीख और समय से संबंधित है, तो DATETIMEआधी रात के साथ ही समय के रूप में भंडारण पर विचार करें । इसलिये:

जब SQL सर्वर फ़िल्टर किए गए कॉलम के प्रकार को शाब्दिक रूप से परिवर्तित करता है, तो यह मध्यरात्रि को मानता है जब एक समय भाग इंगित नहीं किया जाता है। यदि आप निर्दिष्ट तिथि से सभी पंक्तियों को वापस करने के लिए ऐसा फ़िल्टर चाहते हैं, तो आपको यह सुनिश्चित करने की आवश्यकता है कि आप समय के रूप में आधी रात के साथ सभी मूल्यों को संग्रहीत करते हैं।

इस प्रकार, यह मानते हुए कि आप केवल तारीख से संबंधित हैं, और अपने डेटा को इस तरह संग्रहीत करें। उपरोक्त क्वेरी को सरल बनाया जा सकता है:

--112 is ISO format 'YYYYMMDD'
declare @filterDate char(8) = CONVERT(char(8), GETDATE(), 112)

select 
    * 
from 
    Sales.Orders
where
    OrderDate = @filterDate

3

आप यह एक कोशिश कर सकते हैं

CONVERT(DATE, GETDATE()) = CONVERT(DATE,'2017-11-16 21:57:20.000')

मैं कोड का पालन करके MS SQL 2014 के लिए परीक्षण करता हूं

select case when CONVERT(DATE, GETDATE()) = CONVERT(DATE,'2017-11-16 21:57:20.000') then 'ok'
            else '' end

-3

की तरह की तुलना की दो तिथि MM / DD / YYYY को MM / DD / YYYY । याद रखें फील्ड का पहला चीज कॉलम प्रकार डेटटाइम होना चाहिए। उदाहरण: स्तंभ नाम: payment_date dataType: DateTime

उसके बाद आप आसानी से इसकी तुलना कर सकते हैं। प्रश्न है:

select  *  from demo_date where date >= '3/1/2015' and date <=  '3/31/2015'.

यह बहुत आसान है ...... यह परीक्षण किया .....


यह सवाल का काफी जवाब नहीं देता है। यह एक महीने के लिए पूछताछ करता है, एक दिन के लिए नहीं।
कर्टिस येलोप

अपनी मार्च क्वेरी के लिए: यदि तारीख '3/31/2015' समय 13:00 है, तो यह नहीं मिलेगी। आपको <'4/1/2015' का उपयोग करना चाहिए।
कर्टिस येलोप

अंतर्राष्ट्रीय तिथि प्रारूप '2015-03-01' का उपयोग करने पर भी विचार करें। कनाडा (और कई अन्य स्थानों) में, एक आधिकारिक प्रारूप DD / MM / YYYY है जो दोनों प्रारूपों को अस्पष्ट और समस्याग्रस्त बनाता है।
कर्टिस यल्लोप

यह उत्तर 2 तालिकाओं के साथ नहीं है, जैसा कि प्रश्न में अनुरोध किया गया है।
कर्टिस यल्लोप

हाँ im सहमत हूँ, लेकिन IM सिर्फ समाधान साबित नहीं अंतर्राष्ट्रीय समाधान है .. आपको कुछ क्रम बदलना होगा ...
पंकज
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.