2008-11-25 12 views
10

MySQL वाक्य रचना का उपयोग करते हुए और इस तरह एक पंक्ति के साथ एक मेज होने:SQL में दिनांक मानों की तुलना कैसे करें?

... WHERE mydate<='2008-11-25'; 

मैं कोशिश कर रहा हूँ, लेकिन नहीं वास्तव में इसे काम करने के लिए हो रही है:

mydate DATETIME NULL, 

वहाँ की तरह कुछ करने के लिए एक रास्ता है।

उत्तर

8

कभी भी एक उत्तर नहीं मिला। उत्तर देने के इच्छुक व्यक्ति के लिए भी वही है।

WHERE DATEDIFF(mydata,'2008-11-20') >=0; 
+0

आपका स्वागत है;) – Arvo

+3

यह धीमा दिखता है: तालिका में प्रत्येक पंक्ति के लिए फ़ंक्शन कॉल और निहित रूपांतरण। तिथियों की तुलना सीधे तुलना करने का एक तरीका होना चाहिए। –

+0

इंडेक्स इस तरह से अप्रयुक्त हैं ... – FerranB

18

उह, WHERE mydate<='2008-11-25' तरह से यह करने के लिए है। यह काम करना चाहिए।

क्या आपको एक त्रुटि संदेश मिलता है? क्या आप MySQL का एक प्राचीन संस्करण उपयोग कर रहे हैं?

संपादित करें: निम्नलिखित MySQL 5.x

create temporary table foo(d datetime); 
insert into foo(d) VALUES ('2000-01-01'); 
insert into foo(d) VALUES ('2001-01-01'); 
select * from foo where d <= '2000-06-01'; 
+0

मेरे पोस्टग्रेएसक्यूएल डीबीएमएस पर, वास्तव में, यह ठीक काम करता है। एक MySQL कमजोरी हो सकता है? – bortzmeyer

+0

हाँ यह mysql – fmsf

+1

एर में काम नहीं करता है, यह भी MySQL पर काम करता है। :) मैंने अभी यह सुनिश्चित करने की कोशिश की कि मैं पागल नहीं हूं। MySQL का कौन सा संस्करण आप fmfs का उपयोग कर रहे हैं? क्या आपको कोई त्रुटि मिलती है? – Eli

6

मानक SQL सिंटैक्स में पर मेरे लिए ठीक काम करता है, तो आप का प्रयोग करेंगे:

WHERE mydate <= DATE '2008-11-20' 

है, कीवर्ड दिनांक स्ट्रिंग पूर्व में होना चाहिए । कुछ डीबीएमएस में, हालांकि, आपको स्पष्ट होने की आवश्यकता नहीं है; सिस्टम DATE कॉलम को एक स्ट्रिंग में परिवर्तित करेगा, या स्ट्रिंग को स्वचालित रूप से DATE मान में बदल देगा। अगर नाम को स्ट्रिंग में परिवर्तित किया जाता है तो नाममात्र रूप से कुछ रोचक प्रभाव होते हैं - यदि आपके पास पहली सहस्राब्दी (0001-01-01 .. 09 99-12-31) में तिथियां होती हैं और प्रमुख शून्य (एस) को छोड़ दिया जाता है स्वरूपण प्रणाली।

+0

ध्यान दें कि, यदि सभी तिथियां दिखाए गए अनुसार आईएसओ 8601 प्रारूप में हैं, तो स्ट्रिंग तुलना काम करेगी (यह आईएसओ 8601 की एक विशेषता है)। – bortzmeyer

+0

यदि प्रमुख शून्य शामिल हैं, हाँ।सिद्धांत रूप में, यदि आपके पास 1000-01-01 से पहले की तिथियां हैं, तो डीबीएमएस प्रमुख शून्यों को छोड़ सकता है। मुझे यकीन नहीं है कि यह बहुत संभावना है, लेकिन मजेदार चीजें ज्ञात हैं। ओरेकल बीसीई (बीसी) की तारीखों का समर्थन करता है; वे तारों के रूप में विश्वसनीय रूप से तुलना नहीं करते हैं। –

0

आप समय घटक

WHERE mydate<='2008-11-25 23:59:59' 

जोड़ सकता है लेकिन यह है कि डीएसटी बदलाव तारीखों पर विफल हो सकता है यदि mydate '2008-11-25 24:59:59' है, इसलिए यह शायद सबसे सुरक्षित है से पहले सब कुछ हड़पने के लिए अगले तारीख:

WHERE mydate < '2008-11-26 00:00:00' 
0

आपका समस्या हो सकती है कि आप DATETIME डेटा के साथ काम कर रहे हैं, बस तारीखें नहीं। यदि किसी पंक्ति में एक माईडेट है जो '2008-11-25 09:30 पूर्वाह्न' है, तो आपका जहां mydate < = '2008-11-25'; उस पंक्ति को वापस नहीं जा रहा है। '2008-11-25' में 00:00 (मध्यरात्रि) का एक अंतर्निहित समय है, इसलिए दिनांक भाग समान है, फिर भी वे बराबर नहीं हैं, और माईडेट बड़ा है।

यदि आप < '2008-11-26' का उपयोग < = '2008-11-25' के बजाय करते हैं, तो यह काम करेगा। डेटीफ विधि काम करती है क्योंकि यह केवल तारीख भाग की तुलना करती है, और समय को अनदेखा करती है।

संबंधित मुद्दे