2011-07-30 11 views
20

मैं उपयोगकर्ता को अपूर्ण (उदाहरण के लिए केवल वर्ष 2005, या जनवरी 1 99 8) की तारीखों को पेश करने की संभावना प्रदान करना चाहता हूं, लेकिन साल, महीने, दिन के साथ पूर्ण तिथियां भी प्रदान करना चाहता हूं। क्या मैं इसे डीबी में एक एकल दिनांक फ़ील्ड का उपयोग करके पूरा कर सकता हूं?MySQL दिनांक फ़ील्ड में अपूर्ण तिथि

मैंने UPDATE tableA SET mydate = '2001-00-00' को आजमाया है और ऐसा लगता है कि यह काम नहीं करता है (कोई त्रुटि नहीं) लेकिन मुझे यकीन नहीं है कि यह सही है या नहीं। आंतरिक रूप से मुझे लगता है कि टाइमस्टैम्प का उपयोग किया जाता है, तो MySQL उन 0 का प्रतिनिधित्व कैसे कर सकता है?

+0

जब आप 'तालिका से SELECT mydate' पूछते हैं तो आपको क्या मिलता है? – phlogratos

+0

सही मूल्य i.e. 2001-00-00। मेरी चिंता यह है कि मैं कुछ मानक व्यवहार का शोषण कर रहा हूं जो कुछ चाल पर निर्भर करता है जो कुछ दिनों में कुछ परिस्थितियों में तोड़ सकता है या काम नहीं कर सकता है। –

उत्तर

22

वहाँ MySQL अधूरा दिनांकों अनुमति देने के बारे documentation for the DATE_FORMAT() में एक छोटी सी टिप्पणी है: माह और दिन विनिर्देशक के लिए

सीमाओं तथ्य यह है कि इस तरह के MySQL के रूप में 'अधूरा तारीखों के भंडारण की अनुमति देता है की वजह से शून्य के साथ शुरू 2014-00-00 '।

रूप @wonk0 से कहा, MySQL ALLOW_INVALID_DATES सेट हो जाएगा 0000-00-00 00:00:00 को अमान्य तिथियां सेट जब नहीं है। हालांकि, यहां तक ​​कि जब ALLOW_INVALID_DATES सेट नहीं है, तो एक वैध वर्ष डालने के साथ महीने और दिन शून्य पर सेट इस व्यवहार को ट्रिगर नहीं करता है - कम से कम मेरे परीक्षण में नहीं (MySQL 5.1.54-1ubuntu4)। मैंने बिना किसी समस्या के पहले इस सुविधा का उपयोग किया है, लेकिन अब तक मैं इस व्यवहार का वर्णन करने वाले किसी भी विस्तृत दस्तावेज़ीकरण को खोजने में असमर्थ हूं।

दिनांक/समय तुलना भी अपेक्षित कार्य के रूप में दिखाई देती है: उदाहरण के लिए, 2011-01-00 > 2011-00-00 और 2011-00-01 > 2011-00-00 जैसा आप उम्मीद करेंगे।

अद्यतन

this answer एक समान प्रश्न के देखें (एक और माइक द्वारा)। यह निश्चित गाइड से MySQL 5 लिए एक उद्धरण के लिए अंक:

MySQL के पुराने संस्करणों में, तिथि और DATETIME डेटा प्रकार केवल प्रकार की जाँच की एक सीमित मात्रा में किया था। महीनों के लिए 0 और 12 के बीच मान, और 0 और 31 दिनों के लिए आम तौर पर अनुमति दी गई थी। हालांकि, यह सही डेटा प्रदान करने के लिए ग्राहक कार्यक्रम की ज़िम्मेदारी है। ( उदाहरण के लिए, 0 को एक महीने या दिन के लिए एक स्वीकार्य मूल्य के क्रम में, है अधूरी या अज्ञात डेटा भंडारण की संभावना प्रदान करते हैं।)

MySQL 5.0.2 शुरुआत के साथ, वहाँ एक और अधिक पूरी तरह से मान्यता है, इसलिए कि केवल वैध डेटा संग्रहीत किया जा सकता है। अभी भी महीने और दिन मान 0, साथ ही तिथि 0000-00-00 की अनुमति है।

+1

क्या यह धारणा है कि तारीख को संग्रहीत करने के लिए टाइमस्टैम्प का उपयोग गलत है? क्योंकि मैं नहीं देखता कि आप टाइमस्टैम्प के रूप में 2011-00-00 का प्रतिनिधित्व कैसे कर सकते हैं। –

+1

@ ओमर कोहल: हाँ, मुझे लगता है कि धारणा गलत है। 'TIMESTAMP' की' DATETIME' की तुलना में एक छोटी सी सीमा है। एक 'DATETIME' 8 बाइट्स का उपयोग करता है, जबकि' TIMESTAMP' 4 बाइट्स का उपयोग करता है। [डेटा प्रकार संग्रहण आवश्यकताएं] देखें (http://dev.mysql.com/doc/refman/5.5/en/storage-requirements.html#id918335) – Mike

+1

उत्कृष्ट उत्तर, सबसे अच्छा मुझे दूर और व्यापक खोज मिल गया है। –

2

अच्छा, यदि आपने दिनांक फ़ील्ड का उपयोग किया है तो आपको उन 0 की अपेक्षा करनी चाहिए। एक तरह से आप उनसे छुटकारा पा सकते हैं varchar चयन का उपयोग करके। हालांकि, डेट फ़ील्ड का उपयोग करना बेहतर है क्योंकि वहां संग्रहित किया जाता है।

आप उन तो एक अधूरी दिनांक दर्ज करने के लिए यह एक varchar हो गया है और उस मामले में आप उस स्तंभ

+0

यह मेरा अंतिम उपाय होगा। निश्चित रूप से तिथि प्रारूप में चीजें हमेशा ऑर्डर करने के लिए अच्छी तरह से होती हैं। –

+1

हाँ उपयोगकर्ताओं को तारीख को प्रारूपित करने की इजाजत देने के बजाय, मुझे सलाह है कि आप केवल – DaMainBoss

+0

+1 को बहुत अच्छे बिंदु पर मौजूदा 'डेटेटिमस्टैम्प' प्रारूपित करने के लिए एसक्यूएल को अनुमति दें। डैट्स जो मैंने किया होगा –

1

तारीखों के भंडारण भागों पर निर्भर करता है में अपनी स्क्रिप्ट और दुकान के साथ इनपुट फ़ॉर्मेट कर सकते हैं अनुमति देने के लिए है, तो एसक्यूएल मोड MySQL चल रहा है। कृपया http://dev.mysql.com/doc/refman/5.1/en/server-sql-mode.html पढ़ें, खासकर http://dev.mysql.com/doc/refman/5.1/en/server-sql-mode.html#sqlmode_allow_invalid_dates में अमान्य तिथियों के बारे में।

+1

"ALLOW_INVALID_DATES: तिथियों की पूरी जांच न करें। केवल जांच करें कि माह 1 से 12 तक है और दिन 1 से 31 तक है।" इस मामले में यह लागू नहीं होता है क्योंकि न तो महीने और न ही दिन उस सीमा में हैं ... (00 दोनों) –

+0

'केवल जांच करें कि माह 1 से 12 तक है और दिन 1 से लेकर सीमा में है 31' यह एक महीने या 0 के दिन क्यों अनुमति देता है? – phlogratos

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