क्या मुझे MySQL में डेटाटाइम या टाइमस्टैम्प डेटा प्रकार का उपयोग करना चाहिए?




datetime timestamp (20)

2016 + : जो मैं सलाह देता हूं वह है कि अपना MySQL टाइमज़ोन यूटीसी पर सेट करें और DATETIME का उपयोग करें:

कोई भी हालिया फ्रंट-एंड फ्रेमवर्क (कोणीय 1/2, प्रतिक्रिया, वू, ...) आसानी से और स्वचालित रूप से आपके यूटीसी डेटाटाइम को स्थानीय समय में परिवर्तित कर सकता है।

इसके अतिरिक्त:

(जब तक आप अपने सर्वर के टाइमज़ोन को बदलने की संभावना नहीं रखते)

AngularJs के साथ उदाहरण

// back-end: format for angular within the sql query
SELECT DATE_FORMAT(my_datetime, "%Y-%m-%dT%TZ")...

// font-end Output the localised time
{{item.my_datetime | date :'medium' }}

यहां उपलब्ध सभी स्थानीय समय प्रारूप: https://docs.angularjs.org/api/ng/filter/date

क्या आप datetime या datetime फ़ील्ड का उपयोग करने की सलाह देंगे, और क्यों (MySQL का उपयोग कर)?

मैं सर्वर के पक्ष में PHP के साथ काम कर रहा हूँ।


  1. TIMESTAMP DATETIME के ​​लिए चार बाइट बनाम आठ बाइट्स है।

  2. टाइमस्टैम्प डेटाबेस पर भी हल्का है और तेजी से अनुक्रमित है।

  3. DATETIME प्रकार का उपयोग तब किया जाता है जब आपको उन मानों की आवश्यकता होती है जिनमें दिनांक और समय दोनों जानकारी होती है। MySQL 'YYYY-MM-DD HH: MM: SS' प्रारूप में DATETIME मानों को पुनर्प्राप्त और प्रदर्शित करता है। समर्थित श्रेणी '1000-01-01 00:00:00' से '99 99-12-31 23:59:59' है।

TIMESTAMP डेटा प्रकार की '1970-01-01 00:00:01' की एक श्रृंखला है 'यूटीसी' 2038-01-09 03:14:07 'यूटीसी। MySQL संस्करण और SQL मोड सर्वर के चलते SQL मोड के आधार पर इसमें अलग-अलग गुण हैं।

  1. DATETIME स्थिर है जबकि TIMESTAMP टाइम_ज़ोन सेटिंग द्वारा प्रभावित होता है।

MySQL 5 और बाद में, TIMESTAMP मानों को वर्तमान समय क्षेत्र से भंडारण के लिए यूटीसी में परिवर्तित कर दिया जाता है, और पुनर्प्राप्ति के लिए यूटीसी से वर्तमान समय क्षेत्र में वापस परिवर्तित किया जाता है। (यह केवल TIMESTAMP डेटा प्रकार के लिए होता है, कि अन्य प्रकार के लिए जैसे DATETIME।)

डिफ़ॉल्ट रूप से, प्रत्येक कनेक्शन के लिए वर्तमान समय क्षेत्र सर्वर का समय होता है। समय क्षेत्र को प्रति कनेक्शन आधार पर सेट किया जा सकता है, जैसा कि MySQL सर्वर समय क्षेत्र समर्थन में वर्णित है।


MySQL और PHP के साथ काम करते समय मैं हमेशा यूनिक्स टाइमस्टैम्प का उपयोग करता हूं। PHP में डिफ़ॉल्ट date विधि होने का मुख्य कारण पैरामीटर के रूप में टाइमस्टैम्प का उपयोग करता है, इसलिए कोई पार्सिंग आवश्यक नहीं होगी।

PHP में वर्तमान यूनिक्स टाइमस्टैम्प प्राप्त करने के लिए, बस time();
और MySQL में SELECT UNIX_TIMESTAMP();


MySQL में ध्यान देने योग्य है कि आप अपने टेबल कॉलम बनाते समय नीचे की पंक्तियों के साथ कुछ उपयोग कर सकते हैं:

on update CURRENT_TIMESTAMP

यह आपके द्वारा एक पंक्ति को संशोधित करने वाले प्रत्येक उदाहरण पर समय अपडेट करेगा और कभी-कभी अंतिम संपादन जानकारी संग्रहीत करने के लिए बहुत उपयोगी होता है। यह केवल टाइमस्टैम्प के साथ काम करता है, हालांकि डेटाटाइम नहीं।


TIMESTAMP DATETIME के ​​लिए 4 बाइट बनाम 8 बाइट्स है।

http://dev.mysql.com/doc/refman/5.0/en/storage-requirements.html

लेकिन स्क्रोनसाइड की तरह कहा गया है कि इसकी वर्ष 1 9 70 की निचली सीमा है। भविष्य में ऐसा कुछ भी हो सकता है जो कि हो सकता है;)


टाइमस्टैम्प और डेटाटाइम के बीच एक और अंतर टाइमस्टैम्प में है, आप डिफ़ॉल्ट रूप से डिफ़ॉल्ट मान नहीं दे सकते हैं।


टाइमस्टैम्प डेटा प्रकार दिनांक और समय स्टोर करता है, लेकिन यूटीसी प्रारूप में, वर्तमान टाइमज़ोन प्रारूप में डेटाटाइम के रूप में नहीं है। और जब आप डेटा लाते हैं, टाइमस्टैंप फिर से चालू समय क्षेत्र में परिवर्तित हो जाता है।

तो मान लीजिए कि आप संयुक्त राज्य अमेरिका में हैं और एक सर्वर से डेटा प्राप्त कर रहे हैं जिसमें संयुक्त राज्य अमेरिका का समय क्षेत्र है। फिर आपको संयुक्त राज्य अमेरिका के समय क्षेत्र के अनुसार तिथि और समय मिल जाएगा। जब इसकी पंक्ति अपडेट हो जाती है तो टाइमस्टैम्प डेटा प्रकार कॉलम हमेशा स्वचालित रूप से अपडेट हो जाता है। तो यह ट्रैक करने के लिए उपयोगी हो सकता है कि पिछली बार किसी विशेष पंक्ति को अपडेट किया गया था।

अधिक जानकारी के लिए आप ब्लॉग पोस्ट टाइमस्टैम्प बनाम डेटाटाइम पढ़ सकते हैं।


नीचे दिए गए उदाहरण दिखाते हैं कि TIMESTAMP दिनांक प्रकार ने time-zone to 'america/new_york' बदलने के बाद मूल्यों को कैसे बदला, जहां DATETIME अपरिवर्तित है।

mysql> show variables like '%time_zone%';
+------------------+---------------------+
| Variable_name    | Value               |
+------------------+---------------------+
| system_time_zone | India Standard Time |
| time_zone        | Asia/Calcutta       |
+------------------+---------------------+

mysql> create table datedemo(
    -> mydatetime datetime,
    -> mytimestamp timestamp
    -> );

mysql> insert into datedemo values ((now()),(now()));

mysql> select * from datedemo;
+---------------------+---------------------+
| mydatetime          | mytimestamp         |
+---------------------+---------------------+
| 2011-08-21 14:11:09 | 2011-08-21 14:11:09 |
+---------------------+---------------------+

mysql> set time_zone="america/new_york";

mysql> select * from datedemo;
+---------------------+---------------------+
| mydatetime          | mytimestamp         |
+---------------------+---------------------+
| 2011-08-21 14:11:09 | 2011-08-21 04:41:09 |
+---------------------+---------------------+

मैंने लेख में अपना जवाब बदल दिया है ताकि लोगों को यह उपयोगी मिल सके, MySQL: डेटाटाइम बनाम टाइमस्टैम्प डेटा प्रकार



मेरे अनुभवों से, यदि आप एक दिनांक फ़ील्ड चाहते हैं जिसमें सम्मिलन केवल एक बार होता है और आप उस विशेष फ़ील्ड पर कोई अपडेट या कोई अन्य कार्रवाई नहीं करना चाहते हैं, तो डेट समय के साथ जाएं।

उदाहरण के लिए, एक पंजीकरण तालिका फ़ील्ड के साथ एक user तालिका पर विचार user । उस user तालिका में, यदि आप किसी विशेष उपयोगकर्ता के अंतिम लॉग इन समय को जानना चाहते हैं, तो टाइमस्टैम्प प्रकार के फ़ील्ड के साथ जाएं ताकि फ़ील्ड अपडेट हो जाए।

यदि आप phpMyAdmin से तालिका बना रहे हैं तो एक पंक्ति अद्यतन होने पर डिफ़ॉल्ट सेटिंग टाइमस्टैम्प फ़ील्ड को अपडेट कर देगी। यदि आपका टाइमस्टैम्प दायर किया गया है तो पंक्ति अद्यतन के साथ अद्यतन नहीं हो रहा है, तो आप टाइमस्टैम्प फ़ील्ड को स्वत: अद्यतन करने के लिए निम्न क्वेरी का उपयोग कर सकते हैं।

ALTER TABLE your_table
      MODIFY COLUMN ts_activity TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP;

मैं न तो एक DATETIME या एक TIMESTAMP फ़ील्ड का उपयोग करने की सलाह देते हैं। यदि आप पूरे दिन (जन्मदिन की तरह) का प्रतिनिधित्व करना चाहते हैं, तो DATE के प्रकार का उपयोग करें, लेकिन यदि आप उससे अधिक विशिष्ट हैं, तो संभवतः आप एक वास्तविक क्षण को रिकॉर्ड करने में रुचि रखते हैं क्योंकि एक इकाई के विपरीत समय (दिन, सप्ताह, महीना, वर्ष)। DATETIME या TIMESTAMP का उपयोग करने के बजाय, एक बिगिनट का उपयोग करें, और युग के बाद मिलीसेकंड की संख्या को स्टोर करें (System.currentTimeMillis () यदि आप जावा का उपयोग कर रहे हैं)। इसमें कई फायदे हैं:

  1. आप विक्रेता लॉक-इन से बचें। काफी अधिक डेटाबेस प्रत्येक अपेक्षाकृत समान फैशन में पूर्णांक का समर्थन करता है। मान लीजिए कि आप दूसरे डेटाबेस में जाना चाहते हैं। क्या आप MySQL के DATETIME मानों के बीच अंतर और ओरेकल को परिभाषित करने के बारे में चिंता करना चाहते हैं? MySQL के विभिन्न संस्करणों में से भी, TIMESTAMPS के पास परिशुद्धता का एक अलग स्तर है। यह केवल हाल ही में था कि MySQL टाइमस्टैम्प में मिलीसेकंड का समर्थन करता है।
  2. कोई टाइमज़ोन समस्या नहीं है। अलग-अलग डेटा प्रकारों के साथ टाइमज़ोन के साथ क्या होता है, इस पर कुछ अंतर्दृष्टिपूर्ण टिप्पणियां दी गई हैं। लेकिन क्या यह सामान्य ज्ञान है, और क्या आपके सहकर्मियों को यह जानने के लिए समय लगेगा? दूसरी तरफ, एक बिगिनट को java.util.Date में बदलना गड़बड़ करना बहुत मुश्किल है। बिगिनट का उपयोग करने से टाइमज़ोन के रास्ते के साथ कई मुद्दों का सामना करना पड़ता है।
  3. श्रेणियों या परिशुद्धता के बारे में कोई चिंता नहीं। भविष्य की तारीख सीमाओं से कम कटौती के बारे में आपको चिंता करने की ज़रूरत नहीं है (TIMESTAMP केवल 2038 तक जाता है)।
  4. थर्ड-पार्टी टूल एकीकरण। एक पूर्णांक का उपयोग करके, यह डेटाबेस के साथ इंटरफेस करने के लिए तीसरे पक्ष के उपकरण (जैसे EclipseLink) के लिए तुच्छ है। प्रत्येक तीसरे पक्ष के उपकरण को "डेटाटाइम" की समान समझ नहीं होगी क्योंकि MySQL करता है। हाइबरनेट में कोशिश करना और पता लगाना चाहते हैं कि क्या आपको java.sql.TimeStamp या java.util.Date ऑब्जेक्ट का उपयोग करना चाहिए यदि आप इन कस्टम डेटा प्रकारों का उपयोग कर रहे हैं? अपने मूल डेटा प्रकारों का उपयोग करना तीसरे पक्ष के उपकरण तुच्छ के साथ उपयोग करते हैं।

यह समस्या निकटता से संबंधित है कि आपको डेटाबेस में धन मूल्य (यानी $ 1.99) कैसे स्टोर करना चाहिए। क्या आप एक दशमलव, या डेटाबेस के मनी प्रकार का उपयोग करना चाहिए, या सभी को सबसे खराब? इन विकल्पों में से 3 विकल्प भयानक हैं, ऊपर सूचीबद्ध कारणों में से कई के लिए। समाधान BIGINT का उपयोग करके सेंट में धन के मूल्य को संग्रहीत करना है, और फिर जब आप उपयोगकर्ता को मान प्रदर्शित करते हैं तो सेंट को डॉलर में परिवर्तित करें। डेटाबेस का काम डेटा स्टोर करना है, और उस डेटा को घुसपैठ नहीं करना है। डेटाबेस में देखे जाने वाले इन सभी फैंसी डेटा-प्रकार (विशेष रूप से ओरेकल) थोड़ा जोड़ते हैं, और आपको विक्रेता लॉक-इन के लिए सड़क से शुरू करते हैं।


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

विचार करने के लायक एक और बात:

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


मैं हमेशा पंक्ति मेटाडेटा (दिनांक निर्मित या संशोधित) के अलावा किसी अन्य चीज़ के लिए DATETIME फ़ील्ड का उपयोग करता हूं।

जैसा dev.mysql.com/doc/refman/5.1/en/datetime.html MySQL दस्तावेज़ में dev.mysql.com/doc/refman/5.1/en/datetime.html है:

DATETIME प्रकार का उपयोग तब किया जाता है जब आपको उन मानों की आवश्यकता होती है जिनमें दिनांक और समय दोनों जानकारी होती है। MySQL 'YYYY-MM-DD HH: MM: SS' प्रारूप में DATETIME मानों को पुनर्प्राप्त और प्रदर्शित करता है। समर्थित श्रेणी '1000-01-01 00:00:00' से '99 99-12-31 23:59:59' है।

...

TIMESTAMP डेटा प्रकार की '1970-01-01 00:00:01' की एक श्रृंखला है 'यूटीसी' 2038-01-09 03:14:07 'यूटीसी। MySQL संस्करण और SQL मोड सर्वर के चलते SQL मोड के आधार पर इसमें अलग-अलग गुण हैं।

आप सामान्य उपयोग में TIMESTAMPs पर निचली सीमा को हिट करने की संभावना रखते हैं - उदाहरण के लिए जन्मदिन संग्रहित करना।


इस आलेख से लिया गया संदर्भ:

मुख्य मतभेद:

TIMESTAMP रिकॉर्ड में परिवर्तनों को ट्रैक करने के लिए उपयोग किया जाता था, और जब रिकॉर्ड बदल जाता है तो हर बार अद्यतन होता है। DATETIME विशिष्ट और स्थैतिक मूल्य को संग्रहीत करने के लिए उपयोग किया जाता है जो रिकॉर्ड में किसी भी बदलाव से प्रभावित नहीं होता है।

TIMESTAMP भी विभिन्न समय क्षेत्र संबंधित सेटिंग से प्रभावित है। DATETIME स्थिर है।

टाइमस्टैम्प ने वर्तमान समय क्षेत्र को भंडारण के लिए यूटीसी में परिवर्तित कर दिया, और पुनर्प्राप्ति के दौरान वर्तमान समय क्षेत्र में परिवर्तित हो गया। DATETIME ऐसा नहीं कर सकता है।

TIMESTAMP समर्थित श्रेणी: '1970-01-01 00:00:01' यूटीसी से '2038-01-19 03:14:07' यूटीसी डेटाटाइम समर्थित श्रेणी: '1000-01-01 00:00:00' से 99 99 -12-31 23:59:59 '


timestamp फ़ील्ड timestamp फ़ील्ड का एक विशेष मामला है। आप विशेष गुण रखने के लिए timestamp कॉलम बना सकते हैं; इसे या तो बनाने और / या अपडेट पर अपडेट करने के लिए सेट किया जा सकता है।

"बड़े" डेटाबेस शब्दों में, timestamp में कुछ विशेष-मामले ट्रिगर्स हैं।

जो सही है वह पूरी तरह से निर्भर करता है कि आप क्या करना चाहते हैं।


TIMESTAMPको 4 बाइट की आवश्यकता होती है, जबकि एक DATETIMEको 8 बाइट की आवश्यकता होती है।


मुझे अनावश्यक ट्रिगर्स के उपयोग के बिना वर्तमान समय के आधार पर स्वचालित रूप से स्वचालित रूप से अपडेट करने की TIMESTAMP की क्षमता में निरर्थक उपयोगिता मिली। हालांकि यह सिर्फ मुझे है, हालांकि TIMESTAMP यूटीसी जैसा है जैसा कहा गया था।

यह विभिन्न टाइमज़ोन में ट्रैक रख सकता है, इसलिए यदि आपको उदाहरण के लिए एक सापेक्ष समय प्रदर्शित करने की आवश्यकता है, तो यूटीसी समय वह है जो आप चाहते हैं।


मेरे मामले में, मैंने यूटीसी को सब कुछ के लिए एक समय क्षेत्र के रूप में सेट किया है: सिस्टम, डेटाबेस सर्वर, आदि हर बार जब मैं कर सकता हूं। अगर मेरे ग्राहक को एक और समय क्षेत्र की आवश्यकता है, तो मैं इसे ऐप पर कॉन्फ़िगर करता हूं।

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

एक प्लस के रूप में, डेटाबेस के माइग्रेशन के मामले में किसी अन्य टाइमज़ोन के साथ, मैं टाइमस्टैम्प का उपयोग करके अधिक आत्मविश्वास महसूस करता हूं। समकक्ष समय के साथ दो क्षणों के बीच मतभेदों की गणना करते समय और 1 घंटे या उससे कम की सटीकता की आवश्यकता होने पर संभावित मुद्दों को न कहें।

तो, संक्षेप में, मैं टाइमस्टैम्प के इस फायदे का महत्व देता हूं:

  • अंतरराष्ट्रीय (बहुकालिक क्षेत्र) ऐप्स पर उपयोग करने के लिए तैयार है
  • समय क्षेत्र के बीच आसान माइग्रेशन
  • दुविधाओं की गणना करने के लिए बहुत आसान है (बस टाइमस्टैम्प दोनों घटाएं)
  • ग्रीष्मकालीन समय अवधि में / बाहर तिथियों के बारे में कोई चिंता नहीं

इन सभी कारणों से, मैं यूटीसी और टाइमस्टैम्प फ़ील्ड्स चुनता हूं जहां सकारात्मक है। और मैं सिरदर्द से बचता हूं;)


मैं BIGINTयूटीसी भंडारण करते समय केवल हस्ताक्षरित का उपयोग करता हूं ...

जिसे तब भी PHP में स्थानीय समय में समायोजित किया जा सकता है।

के DATETIMEसाथ चयन करने के लिए FROM_UNIXTIME( integer_timestamp_column )

एक स्पष्ट रूप से उस कॉलम पर एक इंडेक्स सेट करना चाहिए, अन्यथा कोई अग्रिम नहीं होगा।







sqldatatypes