2013-09-06 6 views
16

यह वास्तव में मेरी कोई समस्या नहीं है, लेकिन कल्पना करें कि किसी ने मध्ययुगीन काल के बारे में एक वेबसाइट बनाई है और तारीखों को स्टोर करना चाहता है, तो वे इसके बारे में कैसे जाएंगे?डेटाबेस में बहुत पुरानी तारीखों को कैसे स्टोर करें?

MySQLs DATE के लिए spec का कहना है कि यह वर्ष 1000 से नीचे नहीं जाएगा। प्रारूप YYYY-MM-DD है जब यह समझ में आता है। 995 में आप the death of Kenneth II of Scotland के बारे में जानकारी कैसे स्टोर कर सकते हैं? बेशक आप इसे एक स्ट्रिंग के रूप में स्टोर कर सकते हैं, लेकिन वास्तविक दिनांक-प्रकार विकल्प हैं?

+1

इस तरह के मामलों में, आप एक अलग डेटाबेस का उपयोग पर विचार हो सकता; शायद PostgreSQL आपको जिस तारीख सीमा की आवश्यकता है, प्रदान कर सकता है? ([डॉक्स] (http://www.postgresql.org/docs/current/static/datatype-datetime.html) एक उल्लेखनीय रूप से अधिक तिथि सीमा लागू करने के लिए प्रतीत होता है) – Spudley

+0

@ स्प्डले: ओरेकल, डीबी 2, फायरबर्ड डॉन ' उस सीमा भी नहीं है। तो बहुत सारे विकल्प हैं। –

+0

@a_horse_with_no_name - PostgreSQL mySQL के बाद सबसे प्रसिद्ध ओपन सोर्स डीबी है, लेकिन हाँ, बहुत सारे विकल्प हैं। – Spudley

उत्तर

4

असल में, आप भी कर सकते हैं documentation स्पष्टीकरण के बावजूद वर्ष 1000 MySQL में नीचे दुकान दिनांक:

 
mysql> describe test; 
+-------+---------+------+-----+---------+-------+ 
| Field | Type | Null | Key | Default | Extra | 
+-------+---------+------+-----+---------+-------+ 
| id | int(11) | YES |  | NULL |  | 
| birth | date | YES |  | NULL |  | 
+-------+---------+------+-----+---------+-------+ 

-आप अभी भी YYYY प्रारूप में इनपुट साल की जरूरत है:

 
mysql> insert into test values (1, '0995-03-05'); 
Query OK, 1 row affected (0.02 sec) 

mysql> select * from test; 
+------+------------+ 
| id | birth  | 
+------+------------+ 
| 1 | 0995-03-05 | 
+------+------------+ 
1 row in set (0.00 sec) 

आप -और दिनांक:

के साथ इसे संचालित करने में सक्षम हो जाएगा

सुरक्षा के लिए। मैंने कभी किसी मामले का सामना नहीं किया है जब यह MySQL 5.x में काम नहीं करेगा (कारण, इसका मतलब यह नहीं है कि यह 100% काम करेगा, लेकिन कम से कम यह कुछ संभावना के साथ विश्वसनीय है)

बीसी तिथियों के बारे में (मसीह के नीचे)। मुझे लगता है कि यह आसान है - MySQL में नकारात्मक दिनांकों को संग्रहीत करने के लिए कोई रास्ता नहीं है। अर्थात। आपके द्वारा हस्ताक्षरित पूर्णांक क्षेत्र के रूप में अलग से दुकान साल की आवश्यकता होगी:

 
mysql> select '0001-05-04' - interval 1 year as above_bc, '0001-05-04' - interval 2 year as below_bc; 
+------------+----------+ 
| above_bc | below_bc | 
+------------+----------+ 
| 0000-05-04 | NULL  | 
+------------+----------+ 
1 row in set, 1 warning (0.00 sec) 

mysql> show warnings; 
+---------+------+--------------------------------------------+ 
| Level | Code | Message         | 
+---------+------+--------------------------------------------+ 
| Warning | 1441 | Datetime function: datetime field overflow | 
+---------+------+--------------------------------------------+ 
1 row in set (0.00 sec) 

लेकिन मुझे लगता है, किसी भी मामले में (नीचे/वर्ष 0 ऊपर) यह उस मामले में पूर्णांक के रूप में की दुकान तारीख भागों में बेहतर है - यह भरोसा नहीं होगा अनियंत्रित सुविधा के लिए। हालांकि, आपको उन 3 फ़ील्डों के साथ काम करने की आवश्यकता होगी, जो तिथियों के रूप में नहीं हैं (इसलिए, कुछ अर्थों में यह आपकी समस्या का समाधान नहीं है)

+0

डेट-फ़ंक्शंस बनाम हैकनेस का उपयोग करें। अच्छा सुझाव! –

+0

@GerbenJacobs यह दस्तावेज नहीं है, हां। लेकिन यह MySQL 5.x में काम करेगा - मैंने कभी भी इस मामले का सामना नहीं किया है जब यह सही परिणाम नहीं देगा –

+2

बीसी तिथियों के बारे में क्या? – Adam

0

अफसोस की बात है, मुझे लगता है कि वर्तमान में सबसे आसान विकल्प वर्ष के साथ वर्ष, महीने और दिन को अलग-अलग क्षेत्रों में smallint के रूप में स्टोर करना है।

+0

और यदि मैं ब्रह्मांड की शुरुआत की तारीख बनाना चाहता हूं तो क्या होगा? :) वर्तमान ब्रह्मांड का वर्णन करने के लिए छोटा सा प्रतीत नहीं होता है :-) –

+0

आप संभवतः mezzacotta.net के रचनाकारों से पूछ सकते हैं कि वे दिनांक कैसे संभालते हैं (क्योंकि उनका कार्यान्वयन वास्तव में ब्रह्मांड की आयु की भविष्यवाणी करने वाली तारीखों को संभाल सकता है) http: //www.mezzacotta .net/archive.php? date = -9999999999999-01-01 – Mchl

2

एक डीबीएम चुनें जो आप करना चाहते हैं। अन्य मुफ्त डेटाबेस प्रबंधन प्रणालियों में, PostgreSQL 4713 ईसा पूर्व से 2 9 4276 ईस्वी तक एक टाइमस्टैम्प रेंज का समर्थन करता है।

यदि आप वर्ष, महीने और दिन के लिए अलग-अलग कॉलम में तारीख को तोड़ते हैं, तो आपको यह गारंटी देने के लिए और अधिक तालिकाओं और बाधाओं की भी आवश्यकता है कि उन स्तंभों में मान वास्तविक तिथियां दर्शाते हैं। यदि वे कॉलम आपको {2013, 2, 2 9} मान स्टोर करने देते हैं, तो आपकी तालिका टूटी हुई है। एक डीबीएमएस जो आपकी सीमा में तिथियों का समर्थन करता है पूरी तरह से इस तरह की समस्या से बचाता है।

अन्य समस्याओं को आप तारीखों कि सीमा से बाहर हैं पर

  • गलत तारीख अंकगणित हो सकती हैं।
  • सीमा से बाहर की तारीखों पर गलत लोकेल-विशिष्ट स्वरूपण।
  • सीमा से बाहर की तारीखों पर तिथि और समय कार्यों से आश्चर्यजनक व्यवहार।
  • Gregorian calendar weirdness

ग्रेगोरियन कैलेंडर अजीबता? ग्रेट ब्रिटेन में, 2 सितंबर, 1752 के बाद का दिन 14 सितंबर, 1752 है।निम्नानुसार अनदेखा करने के लिए PostgreSQL documents their rationale

PostgreSQL सभी दिनांक/समय गणनाओं के लिए जूलियन तिथियों का उपयोग करता है। इसने भविष्य में 4713 ईसा पूर्व से की सही गणना की उपयोगी संपत्ति है, इस धारणा का उपयोग करते हुए कि वर्ष की लंबाई 365.2425 दिन है।

1 9वीं शताब्दी से पहले तिथि सम्मेलन दिलचस्प पढ़ने, के लिए बनाते हैं लेकिन दिनांक/समय हैंडलर में कोडिंग कोडिंग के लिए पर्याप्त नहीं हैं। http://dev.mysql.com/doc/refman/5.6/en/datetime.html

For the DATE and DATETIME range descriptions, “supported” means that although earlier values might work, there is no guarantee. 

तो वहाँ एक अच्छा बदलाव है कि एक व्यापक रेंज एक पर्याप्त कॉन्फ़िगर किया गया MySQL स्थापना दिया काम करता रहेगा से

0

के शब्दों में।

सुनिश्चित करें कि TIMESTAMP का उपयोग न करें, जो कि एक गैर-ऋणात्मक सीमा है।

The TIMESTAMP data type is used for values that contain both date and time parts. TIMESTAMP has a range of '1970-01-01 00:00:01' UTC to '2038-01-19 03:14:07' UTC. 

यहाँ एक जावास्क्रिप्ट उदाहरण कितनी दूर यूनिक्स काल से पहले (1) आप 2^36 सेकंड के साथ मिल सकता है * -1000 (जावास्क्रिप्ट के लिए मिलीसेकेंड को पाने के लिए)।

d = new Date((Math.pow(2, 36) - 1) * -1000) 
Sun May 13 -208 18:27:45 GMT+0200 (Westeuropäische Sommerzeit) 

तो मैं ऐतिहासिक तारीखों को युग के सापेक्ष बिगिनट के रूप में स्टोर करने का सुझाव दूंगा।

MxSQL 5.6 के लिए http://dev.mysql.com/doc/refman/5.6/en/integer-types.html देखें।


(1)

epoch = new Date(0) 
Thu Jan 01 1970 01:00:00 GMT+0100 (Westeuropäische Normalzeit) 
epoch.toUTCString() 
"Thu, 01 Jan 1970 00:00:00 GMT" 
संबंधित मुद्दे