मेरे पास दो टेबल हैं जहां कॉलम [date]
टाइप है DATETIME2(0)
।
मुझे दो रिकॉर्ड की तुलना केवल उनके डेट पार्ट्स (दिन + महीना + साल) से करनी है, टाइम पार्ट्स (घंटे + मिनट + सेकंड) को छोड़ना होगा।
मैं उसे कैसे कर सकता हूँ?
मेरे पास दो टेबल हैं जहां कॉलम [date]
टाइप है DATETIME2(0)
।
मुझे दो रिकॉर्ड की तुलना केवल उनके डेट पार्ट्स (दिन + महीना + साल) से करनी है, टाइम पार्ट्स (घंटे + मिनट + सेकंड) को छोड़ना होगा।
मैं उसे कैसे कर सकता हूँ?
जवाबों:
मार्क के जवाब में एक छोटी सी खामी यह है कि दोनों डेटफिल्ड को टाइपकास्ट किया गया है, जिसका अर्थ है कि आप किसी भी इंडेक्स का लाभ उठाने में असमर्थ होंगे।
इसलिए, यदि कोई क्वेरी लिखने की आवश्यकता है जो किसी दिनांक फ़ील्ड पर एक सूचकांक से लाभान्वित हो सकती है, तो निम्नलिखित (बल्कि जटिल) दृष्टिकोण आवश्यक है।
(DF1 >= CAST(DF2 AS DATE)) AND (DF1 < DATEADD(dd, 1, CAST(DF2 AS DATE)))
पुनश्च: केवल तारीख (SQL सर्वर के पुराने संस्करणों में) निकालने का एक अन्य तरीका यह है कि कैसे आंतरिक रूप से तिथि का प्रतिनिधित्व किया जाता है।
CAST(FLOOR(CAST(DF2 AS FLOAT)) AS DATETIME)
हालांकि मैंने उत्तर को सही के रूप में चिह्नित किया। मैं इस पर ठोकर खाने वाले किसी भी व्यक्ति के लिए कुछ चीजों को छूना चाहता था।
सामान्य तौर पर, यदि आप विशेष रूप से दिनांक मानों को अकेले फ़िल्टर कर रहे हैं। 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
आप यह एक कोशिश कर सकते हैं
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
की तरह की तुलना की दो तिथि MM / DD / YYYY को MM / DD / YYYY । याद रखें फील्ड का पहला चीज कॉलम प्रकार डेटटाइम होना चाहिए। उदाहरण: स्तंभ नाम: payment_date dataType: DateTime ।
उसके बाद आप आसानी से इसकी तुलना कर सकते हैं। प्रश्न है:
select * from demo_date where date >= '3/1/2015' and date <= '3/31/2015'.
यह बहुत आसान है ...... यह परीक्षण किया .....