SQL में दिनांक की तुलना क्वेरी


84

मेरे पास तारीखों के साथ एक तालिका है जो सभी नवंबर महीने में हुई थी। मैंने यह क्वेरी लिखी है

select id,numbers_from,created_date,amount_numbers,SMS_text 
from Test_Table
where 
created_date <= '2013-04-12'

यह क्वेरी महीने 11 (नवंबर) में हुई सब कुछ वापस कर देना चाहिए क्योंकि यह '2013-04-12' (दिसंबर में) की तारीख से पहले हुआ था

लेकिन यह केवल उपलब्ध तारीखें हैं जो 04 (2013- 04 -12) से कम दिनों में हुईं

क्या ऐसा हो सकता है कि यह केवल दिन के हिस्से की तुलना कर रहा हो? और पूरी तारीख नहीं?

इसे कैसे ठीक करें?

बनाया गया_डेट प्रकार की तारीख का है

दिनांक प्रारूप डिफ़ॉल्ट yyyy-dd-MM द्वारा है


1
आप तारीखों की तुलना तार से कर रहे हैं, तारीखों की तारीखों से नहीं
पानागोटिस कानवास

4
शायद यह सोचता है 2013-04-12? 12 अप्रैल है? या शायद created_dateएक तार है और तारीख नहीं है?
jpw

पर देखो कास्ट & Convert T-SQL पुस्तिका पर और अपने स्थान के लिए उचित रूपांतरण का उपयोग
स्टीव

3
बिलकुल डालने की जरूरत नहीं है, बस इन्वारिएन्ट फॉर्मेट '20130412' का इस्तेमाल करें
पनगीओटीस कानावोस

1
फिर तारीख के साथ एक तार भेजने के बजाय, एक पैरामीटर क्वेरी बनाने की कोशिश करें और तारीख को टाइप किए गए पैरामीटर के रूप में पास करें। BTW SQL सर्वर के किस संस्करण का उपयोग कर रहे हैं? DATE को SQL Server 2008 में जोड़ा गया था।
पानागोटिस कानवास

जवाबों:


84

'2013-04-12' के बजाय जिसका अर्थ स्थानीय संस्कृति पर निर्भर करता है, '20130412' का उपयोग करें, जिसे संस्कृति अपरिवर्तनीय प्रारूप के रूप में मान्यता प्राप्त है।

दिसंबर 4 के साथ तुलना करने के लिए चाहते हैं, तो वें , आप '20,131,204' लिखना चाहिए। आप अप्रैल 12 की तुलना करना चाहते हैं वें , आप '20,130,412' लिखना चाहिए।

लेख लिखें एसक्यूएल सर्वर के प्रलेखन से अंतर्राष्ट्रीय लेनदेन-एसक्यूएल स्टेटमेंट्स बताते हैं कि संस्कृति अपरिवर्तनीय कथन कैसे लिखें:

ऐसे अनुप्रयोग जो अन्य API, या Transact-SQL स्क्रिप्ट, संग्रहीत कार्यविधियाँ और ट्रिगर का उपयोग करते हैं, उन्हें अनपेक्षित संख्यात्मक स्ट्रिंग्स का उपयोग करना चाहिए। उदाहरण के लिए, yyyymmdd 19980924 के रूप में।

संपादित करें

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

अपडेट करें

आईएसओ 8601 प्रारूप को शाब्दिक रूप से उपयोग करने के लिए, सभी तत्वों को निर्दिष्ट किया जाना चाहिए। डेटाइम के प्रलेखन के आईएसओ 8601 अनुभाग से उद्धृत करने के लिए

आईएसओ 8601 प्रारूप का उपयोग करने के लिए, आपको प्रत्येक तत्व को प्रारूप में निर्दिष्ट करना होगा। इसमें T, colons (:), और अवधि (।) भी शामिल हैं जो प्रारूप में दिखाए गए हैं।

... दूसरे घटक का अंश वैकल्पिक है। समय घटक 24-घंटे के प्रारूप में निर्दिष्ट है।


@ कैंडी बिल्कुल नहीं, ISO8601 प्रारूप में समय तत्व शामिल है। या के रूप में किए गए दस्तावेज़ों का कहना है , To use the ISO 8601 format, you must specify each element in the format. This also includes the T
पनियागोटिस कानावोस

1
अस्पष्ट होने के लिए क्षमा करें, मेरी बात यह थी कि ISO8601 आपके द्वारा बताए गए तरीके से आदेश को परिभाषित करता है: YYYY-MM-DD या संक्षिप्त YYYYMMDD के लिए। हालाँकि, डॉक्स भी बताता है: "डेटाटाइम ANSI या ISO 8601 अनुरूप नहीं है।" आईएसओ को स्वयं एक समय भाग की आवश्यकता नहीं होगी।
एंड

क्या आप इस तथ्य है कि परिवर्तन नहीं करता है का उल्लेख YYYY-MM-DDकिया गया है नहीं आईएसओ 8601. समय हिस्से के रूप में मान्यता प्राप्त कर रहे हैं की आवश्यकता है। यदि आप करेंगे, या अधूरा कार्यान्वयन, इसे टी-एसक्यूएल की विचित्रता कहें। यह भी हो सकता है कि यह Sybase से ले जाया गया था
Panagiotis Kanavos

32

ऐसे में कोशिश करें

select id,numbers_from,created_date,amount_numbers,SMS_text 
from Test_Table
where 
created_date <= '2013-12-04'

6
संस्कृति विशिष्ट प्रारूप। क्या वह 12 अप्रैल या 4 दिसंबर है? पानी का छींटा-अलग प्रारूप अंतर्राष्ट्रीय प्रारूप नहीं है
पानागोटिस कानवास

1
तो क्या होता है जब आपको अंतरराष्ट्रीय ग्राहकों से डेटा स्टोर करने की आवश्यकता होती है? या तारीख एक वेब ब्राउज़र से आती है जो उपयोगकर्ता की संस्कृति का अनुसरण करती है? दिशानिर्देश एक कारण से मौजूद हैं, और केवल गलत प्रारूप का उपयोग नहीं करने से, आप सभी त्रुटियों से बचते हैं
Panagiotis Kanavos

1
@ नितेश यह 12 अप्रैल को लौट रहा है
हेल्पएस्टरिस्टर

19
पानी का छींटा-अलग प्रारूप @PanagiotisKanavos है अंतर्राष्ट्रीय स्वरूप जब से आईएसओ 8601 1988 अन्य प्रारूप में प्रकाशित हुआ था हतोत्साहित कर रहे हैं और उपहास । यहां तक ​​कि आपके द्वारा पोस्ट किया गया लेख, "अंतर्राष्ट्रीय लेन-देन-एसक्यूएल विवरण लिखें" कभी भी 'yyyymmdd' को "अंतरराष्ट्रीय" मानक के किसी भी प्रकार की पहचान नहीं करता है।
जेसी वेब

2
तारीख के आसपास एकल उद्धरण जोड़कर मेरे लिए यह हल किया। 2/19/2015 प्रारूप का उपयोग कर रहा था। '2/19/2015' में बदल गया और इसने काम करना शुरू कर दिया। सरल विचार के लिए धन्यवाद।
एथन तुर्क

10

यदि आप केवल तारीख के साथ तुलना कर रहे हैं, तो इसे तिथि में परिवर्तित करें ( डेटाटाइम नहीं ) काम करेगा

select id,numbers_from,created_date,amount_numbers,SMS_text 
 from Test_Table
 where 
 created_date <= convert(date,'2013-04-12',102)

यह रूपांतरण गेटडेट () फ़ंक्शन का उपयोग करने के दौरान भी लागू होता है


4

आप डालते हैं <=और यह दी गई तारीख को भी पकड़ लेगा। आप इसे <केवल से बदल सकते हैं ।


2

कृपया नीचे क्वेरी के साथ प्रयास करें

select id,numbers_from,created_date,amount_numbers,SMS_text 
from Test_Table
where 
convert(datetime, convert(varchar(10), created_date, 102))  <= convert(datetime,'2013-04-12')

0

दिनांक प्रारूप yyyy-mm-dd है। इसलिए उपरोक्त क्वेरी 12Apr2013 से पुराने रिकॉर्ड की तलाश कर रही है

सुझाव है कि आप दिनांक स्ट्रिंग को '2013-04-30' पर सेट करके एक त्वरित जाँच करें, यदि कोई वर्ग त्रुटि नहीं है, तो दिनांक प्रारूप को yyyy-mm-dd से पुष्टि की जाती है।


0

तिथि से पहले और बाद में "#" का उपयोग करने का प्रयास करें और अपने सिस्टम की तारीख प्रारूप के बारे में सुनिश्चित करें। हो सकता है "YYYYMMDD O YYYY-MM-DD O MM-DD-YYYY O USING '/ O \'"

उदाहरण के लिए:

 select id,numbers_from,created_date,amount_numbers,SMS_text 
 from Test_Table
 where 
 created_date <= #2013-04-12#
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.