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


2685

क्या आप डेटाइम या टाइमस्टैम्प फ़ील्ड का उपयोग करने की अनुशंसा करेंगे , और क्यों (MySQL का उपयोग करके)?

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


1
यह कुछ प्रासंगिक जानकारी है codeproject.com/Tips/1215635/MySQL-DATETIME-vs-TIMESTAMP
वक्लेह

यदि आप चाहते हैं कि आपका आवेदन फरवरी में टूट जाए, तो 2038 टाइमस्टैम्प का उपयोग करें। दिनांक सीमा की जाँच करें।
विल्सन हक

जवाबों:


1829

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

यदि आपका मतलब है कि आप UNIX टाइमस्टैम्प या देशी MySQL डेटाइम क्षेत्र का उपयोग करने के बीच निर्णय लेना चाहते हैं, तो मूल प्रारूप के साथ जाएं। आप उस तरह से MySQL के भीतर गणना कर सकते हैं ("SELECT DATE_ADD(my_datetime, INTERVAL 1 DAY)")और ("SELECT UNIX_TIMESTAMP(my_datetime)")जब आप इसे PHP से संचालित करना चाहते हैं तो रिकॉर्ड को क्वेरी करते समय मूल्य के प्रारूप को UNIX टाइमस्टैम्प में बदलना सरल है ।


981
एक महत्वपूर्ण अंतर यह है कि DATETIMEएक तारीख का प्रतिनिधित्व करता है (जैसा कि कैलेंडर में पाया जाता है) और एक समय (जैसा कि एक दीवार घड़ी पर देखा जा सकता है), जबकि समय में TIMESTAMPएक अच्छी तरह से परिभाषित बिंदु का प्रतिनिधित्व करता है। यह बहुत महत्वपूर्ण हो सकता है यदि आपका आवेदन समय क्षेत्र को संभालता है। Long 2010-09-01 16:31:00 ’कब तक था? यह इस बात पर निर्भर करता है कि आप किस समयक्षेत्र में हैं। मेरे लिए यह केवल कुछ सेकंड पहले था, आपके लिए यह भविष्य में एक समय का प्रतिनिधित्व कर सकता है। अगर मैं '1970-01-01 00:00:00 UTC' के बाद से 1283351460 सेकंड कहता हूं, तो आप जानते हैं कि मैं किस समय की बात करता हूं। (नीर का उत्कृष्ट उत्तर नीचे देखें)। [नकारात्मक पक्ष: मान्य श्रेणी]।
मैटबियानको

121
एक और अंतर: "देशी" डेटाइम के साथ प्रश्नों को कैश नहीं किया जाएगा, लेकिन टाइमस्टैम्प के साथ प्रश्न - होगा।
OZ_

39
"MySQL में टाइमस्टैम्प्स आम तौर पर रिकॉर्ड में बदलाव को ट्रैक करते थे" यह मत सोचो कि यह एक अच्छा जवाब है। मैटस्टियनको और नीर सेड की तुलना में टाइमस्टैम्प बहुत अधिक शक्तिशाली और जटिल हैं। हालाँकि, उत्तर का दूसरा भाग बहुत अच्छा है। यह सच है कि ब्लविट ने क्या कहा, और यह एक अच्छी सलाह है।
संतागोबासुल्तो

10
इसके अलावा 1 महत्वपूर्ण नोट, DATETIME और TIMESTAMP CURRENT_TIMESTAMP, अब () का उपयोग डिफ़ॉल्ट रूप से मान के रूप में कर सकते हैं, लेकिन उदाहरण के लिए DATE नहीं कर सकते, क्योंकि यह डिफ़ॉल्ट रूप से '0000-00-00' का उपयोग करता है, इसलिए उस मामले को हल करने के लिए U लिखना चाहिए DATE mysql प्रकार के साथ फ़ील्ड / क्षेत्र में वर्तमान दिनांक (समय के बिना) सम्मिलित करने के लिए, उस तालिका में आपका स्वयं का ट्रिगर।
आर्थर कुशमैन

14
@DavidHarkness: प्रलेखन कहते हैं, "स्वत: गुण निर्दिष्ट करने के लिए, CURRENT_TIMESTAMP और पर अद्यतन CURRENT_TIMESTAMP खंड सामान्य का उपयोग करें" dev.mysql.com/doc/refman/5.0/en/timestamp-initialization.html
PLAP

917

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

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


11
इस विषय के लिए यह ओरीली
gcb

13
इस घटना की प्रकृति के बारे में भी: - एक वीडियो-सम्मेलन (TIMESTAMP)। सभी परिचारकों को अपने समय-क्षेत्र के अनुसार समायोजित किए गए समय के निरपेक्ष तात्कालिक संदर्भ को देखना चाहिए। - एक स्थानीय कार्य समय (DATETIME), मुझे यह कार्य 2014/03/31 9:00 पूर्वाह्न पर करना चाहिए, कोई बात नहीं यदि वह दिन न्यूयॉर्क या पेरिस में काम कर रहा हो। मैं उस दिन के स्थानीय समय के 8:00 बजे काम करना शुरू कर दूंगा।
yucer

1
तो अगर मैं सर्वर के टाइम ज़ोन को चेंज करता हूँ, तो TIMESTAMP का मान समान रहेगा या क्या यह भी बदलेगा ??
एंड्रयू

3
@ यूटीसी के बाद से, यह यूटीसी रहेगा। बैकवर्ड रूपांतरण हालांकि "नए" सर्वर टाइमज़ोन में बदल जाएगा।
15 जुलाब 5'17

@ निर्माता - मैं इस तरह से सोचने की सलाह नहीं देता। एक वैश्विक अर्थव्यवस्था में सबसे सुसंगत उपयोग भंडारण के लिए सभी डेटासेट को यूटीसी में परिवर्तित करना है। अधिवेशन द्वारा, डिटाइम को UTC फ़ील्ड के रूप में मानें। यह उन सभी कार्यों पर बोझ डालता है जो यूटीसी में रूपांतरण करने के लिए डेटाेटाइम इनपुट करते हैं, लेकिन यह एक लंबी अवधि के लिए एक क्लीनर डिज़ाइन है। बेशक, उपयोगकर्ता को उनकी वर्तमान सेटिंग्स के आधार पर जानकारी प्रस्तुत करें। यदि उपयोगकर्ता "पेरिस में 09:00" दर्ज करना चाहता है, तो उन्हें पेरिस समय निर्धारित करने दें, फिर 09:00 दर्ज करें। फिर कोई भी व्यक्ति जो न्यूयॉर्क में है, आसानी से देख सकता है कि किस समय उन्हें जागने की जरूरत है, टेलीकांफ्रेंस करने के लिए।
टूलमेकरसैट

524

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

जैसा कि MySQL प्रलेखन में बताया गया है:

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

...

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

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


195
यदि आप बैंकिंग या अचल संपत्ति में हैं, तो आप ऊपरी सीमा को आसानी से मार सकते हैं ... 30 वर्षीय बंधक अब 2038 से आगे जाते हैं
किप

16
बेशक, 64-बिट यूनिक्स टाइमस्टैम्प का उपयोग करें। उदाहरण के लिए, जावा में, new Date().getTime()पहले से ही आपको 64-बिट मान दिया गया है।
osa

5
DATETIME के ​​लिए +1: हमारे डेटा फ्लो में, खरीद और चालान के लिए फिजिकल स्टोर के SQL सर्वर से, वेबपेज पर वर्चुअल स्टोर के लिए MySQL सर्वर में ट्रांसफर किया गया, DATETIME मॉडिफिकेशन डेट-टाइम के लिए बेहतर है क्योंकि यह डेटा प्रकार भी Transact में मौजूद है -SQL। लेकिन TIMESTAMP का मतलब है Transact-SQL में दूसरी चीज़, यह ROWVERSION की तरह द्विआधारी है, हालाँकि MySQL TIMESTAMP, DateTime के समान है। इसलिए हम दो DB की संगतता के लिए TIMESTAMP के उपयोग से बचते हैं।
जकौ

10
कोई जानकारी नहीं। यह सिर्फ MySQL की तुलना में बहुत बड़ी समस्या है और इसमें कोई साधारण सुधार नहीं है: en.wikipedia.org/wiki/Year_2038_problem मुझे विश्वास नहीं है कि MySQL सिर्फ टाइमस्टैम्प घोषित कर सकता है अब 64-बिट हैं और मान लें कि सबकुछ ठीक हो जाएगा। वे हार्डवेयर को नियंत्रित नहीं करते हैं।
scronide

5
जन्मतिथि DATETIME हो सकती है यदि आप जन्म का समय जानते हैं, जैसा कि मैं अपने लिए करता हूं।
क्रिश क्रेग

322

उदाहरण नीचे दिखाने के लिए 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: डेटाइम वर्सस टाइमस्टैम्प डेटा प्रकार


55
ठीक है, वास्तव में DATETIMEसमय-क्षेत्र परिवर्तन के साथ प्रभावी समय बदल गया, TIMESTAMPनहीं बदला लेकिन मानव प्रतिनिधित्व किया।
फ्लिंडेबर्ग

3
ऐसा लगता है कि यह कमांड MySQL 5.6 में काम नहीं करता है set time_zone="america/new_york";
मंजुनाथ रेड्डी

यहाँ सेट time_zone समस्या के लिए जवाब है। stackoverflow.com/questions/3451847/mysql-timezone-change
मंजुनाथ रेड्डी

2
@Flindeberg से सहमत हैं। टाइमस्टैम्प सही समय का प्रतिनिधित्व करता है, डेटाइम का नहीं, समयक्षेत्र परिवर्तन के बाद
नितिन बंसल

193

मुख्य अंतर यह है कि DATETIME स्थिर है जबकि TIMESTAMP time_zoneसेटिंग से प्रभावित होता है ।

इसलिए यह केवल तभी मायने रखता है जब आपके पास - या भविष्य में हो सकता है - समय क्षेत्र में सिंक्रनाइज़ किए गए क्लस्टर।

सरल शब्दों में: यदि मेरे पास ऑस्ट्रेलिया में एक डेटाबेस है, और अमेरिका में एक डेटाबेस को सिंक्रनाइज़ / पॉप्युलेट करने के लिए उस डेटाबेस का एक डंप लेते हैं, तो TIMESTAMP नए समय क्षेत्र में घटना के वास्तविक समय को प्रतिबिंबित करने के लिए अपडेट करेगा, जबकि DATHIME अभी भी एयू समय क्षेत्र में घटना के समय को दर्शाते हैं

DATETIME का एक बढ़िया उदाहरण जहाँ TIMESTAMP का उपयोग किया जाना चाहिए था, वह फ़ेसबुक में है, जहाँ उनके सर्वर कभी भी निश्चित नहीं होते हैं कि समय क्षेत्र के दौरान क्या समय हुआ। एक बार जब मैं बातचीत कर रहा था, जिसमें कहा गया था कि मैं संदेश भेजने से पहले संदेश का जवाब दे रहा था। (यह, निश्चित रूप से मैसेजिंग सॉफ़्टवेयर में खराब समय क्षेत्र अनुवाद के कारण भी हो सकता था यदि समय को सिंक्रनाइज़ किए जाने के बजाय पोस्ट किया जा रहा था।)


83
मुझे नहीं लगता कि यह सोचने का एक अच्छा तरीका है। मैं UTC में सभी तिथियों को संग्रहीत और संसाधित करूँगा और सुनिश्चित करूँगा कि सामने वाला दिए गए समय-क्षेत्र के अनुसार इसे प्रदर्शित करता है। यह दृष्टिकोण सरल और अनुमानित है।
कोस

8
@Kos: UTC में सभी तिथियों को संग्रहीत और संसाधित नहीं कर रहा है, जो TIMESTAMP आंतरिक रूप से कर रहा है? (फिर इसे अपने स्थानीय समय-क्षेत्र को प्रदर्शित करने के लिए परिवर्तित करना?)
कार्बोकेशन

10
मेरे स्थानीय समय क्षेत्र? आपके डीबी को मेरा टाइमजोन कैसे पता चलेगा? ;-) आम तौर पर डेटाबेस और उपयोगकर्ता इंटरफ़ेस के बीच काफी कुछ प्रसंस्करण होता है। मैं पूरी प्रक्रिया के बाद ही स्थानीयकरण करता हूं।
कोस

3
@Koz: मेरे डेटाबेस को आपके डेटाबेस का समय नहीं पता:! लेकिन यह टाइमस्टैम्प को जानता है। आपका डेटाबेस अपने स्वयं के टाइमज़ोन सेटिंग को जानता है और लागू करता है कि टाइमस्टैम्प की व्याख्या / प्रतिनिधित्व करते समय। बीजिंग चीन में 11 दिसंबर 2013 को सुबह 1:01, सिडनी ऑस्ट्रेलिया में 11 दिसंबर 2013 को 1:01 बजे समय के समान समय नहीं है। Google: 'टाइम ज़ोन' और 'प्राइम मेरिडियन'।
इकरन

2
MySQL स्टोरेज के लिए TIMESTAMP मान को वर्तमान समय क्षेत्र से UTC में परिवर्तित करता है, और UTC से वर्तमान समय क्षेत्र में पुनः प्राप्ति के लिए वापस करता है। (यह DATETIME जैसे अन्य प्रकारों के लिए नहीं होता है।) dev.mysql.com/doc/refman/5.5/en/datetime.html
Mahdyfo

124

मैं यह निर्णय शब्दार्थ आधार पर करता हूं।

जब मुझे समय में एक (अधिक या कम) निश्चित बिंदु रिकॉर्ड करने की आवश्यकता होती है, तो मैं टाइमस्टैम्प का उपयोग करता हूं। उदाहरण के लिए जब एक रिकॉर्ड डेटाबेस में डाला गया था या जब कुछ उपयोगकर्ता कार्रवाई हुई थी।

मैं एक डेटाइम फ़ील्ड का उपयोग करता हूं जब दिनांक / समय सेट और मनमाने ढंग से बदला जा सकता है। उदाहरण के लिए जब उपयोगकर्ता बाद में नियुक्तियों को बदल सकता है।


टाइमस्टैम्प- निश्चित समय में, समन्वित यूनिवर्सल टाइम डेटाइम - एक बिंदु के सापेक्ष, एक समय संदर्भ (ej timezone स्थानीय समय) के लिए, हो सकता है .. समन्वित स्थानीय समय?
yucer

110

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

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

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


12
मुझे यह समाधान पसंद है। 2038 में TIMESTAMP की समाप्ति एक बड़ी समस्या है। यह वास्तव में इतनी दूर नहीं है!
चार्ली दलस ने

4
@CharlieDalsass क्या आपको लगता है कि वर्तमान सॉफ्टवेयर उस समय होगा :-P
हबीब परवाड़

13
यदि यह मिलीसेकंड की संख्या के रूप में संग्रहीत किया जाता है, तो यह डेटा को क्वेरी करना कठिन बनाता है
अली सईद

4
यदि आप पोर्टेबिलिटी और कई समय क्षेत्रों में उपयोगकर्ताओं को संभालने या उपयोगकर्ताओं की तुलना में अलग-अलग समय क्षेत्र में डेटाबेस की देखभाल करते हैं, तो यह वास्तव में सबसे अच्छा समाधान है। यदि यह दोष नहीं है तो TIMESTAMP जाने का मार्ग हो सकता है। बहुत बुरा है कि टूटे हुए समाधानों को अधिक वोट मिले क्योंकि वे जल्दी (वर्ष!) पोस्ट किए गए थे।
जर्मन

4
उत्कृष्ट समाधान! और आप बिलकुल सही हैं कि "लॉक इन" किया जा रहा है। जब आपको दूसरों को "आपके लिए काम करने" की आदत पड़ जाती है, तो आप बिट्स और टुकड़ों को खोने लगते हैं जो आपको प्रोग्रामर बनाते हैं।
एफएमसी

98

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

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

लेकिन जैसा कि स्कर्नाइड ने कहा है कि यह वर्ष 1970 की निचली सीमा है। यह किसी भी चीज के लिए बहुत अच्छा है जो भविष्य में हो सकता है;)


185
भविष्य 2038-01-19 03:14:07 यूटीसी पर समाप्त होता है।
मैटबियनको

5
ये बेवकूफी है। मुझे लगा कि TIMESTAMP प्रकार "भविष्य के लिए तैयार" होगा क्योंकि यह अपेक्षाकृत नया है। जब आप अलग-अलग समय क्षेत्रों के साथ काम करते हैं, तो आप UTC और बैकटाइम में डेटाटाइम परिवर्तित करने से परेशान नहीं हो सकते। उन्हें TIMESTAMP को बड़ा करना चाहिए था .. कम से कम 1 बाइट को बड़ा। यह 68 * 255 = 17340 अधिक वर्षों को जोड़ देगा ... हालांकि यह 32 बिट गठबंधन नहीं होगा।
निकसॉफ्ट

10
क्या आप जानते हैं कि 2038 में TIMESTAMP क्यों समाप्त होता है? क्योंकि यह एक पूर्णांक है, और पूर्णांक की सीमा है जो 2147483647 है। मुझे लगता है कि यह कारण है। हो सकता है अगर वे इसके प्रकार को varchar में बदलते हैं और इसके हेरफेर करने के तरीके को बदलते हैं, तो यह "भविष्य के लिए तैयार" होगा।
विंस

6
@vinsa, मुझे नहीं लगता कि यह तब तक तैयार हो जाएगा। अभी भी याद Y2K बग? 2038 आ रहा है।
6

2
2038 तक, MySQL (यदि यह अभी भी मौजूद है) बस 4 से अधिक बाइट्स का उपयोग करने के लिए TIMESTAMP फ़ील्ड को अपडेट करेगा और एक व्यापक श्रेणी की अनुमति देगा
the_nuts

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

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

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

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

  1. DATETIME स्थिर है, जबकि TIMESTAMP time_zone सेटिंग से प्रभावित होता है।

6
आपको # 4 को स्पष्ट करने की आवश्यकता है: संग्रहीत टाइमस्टैम्प निरंतर और गैर-सापेक्ष (पूरी तरह से अज्ञेयवादी) है, जबकि टाइमज़ोन पर, जबकि पुनर्प्राप्ति पर प्रदर्शित आउटपुट अनुरोध सत्र के टाइमज़ोन से प्रभावित होता है। DATETIME हमेशा उस समयक्षेत्र के सापेक्ष होता है जिसे वह रिकॉर्ड किया गया था, और हमेशा उस संदर्भ में विचार किया जाना चाहिए, एक जिम्मेदारी जो अब एप्लिकेशन पर आती है।
क्रिस्टोफर मैक्गोवन

1
बहुत बढ़िया जवाब। इस उत्तर को जोड़ने के लिए, यदि हम उस '2038-01-09 03:14:07' से परे मूल्यों को संग्रहीत करने का प्रयास करते हैं, तो हमें या तो कोई त्रुटि मिलती है या इसे '0000-00-00 00:00:00' के रूप में संग्रहीत किया जाता है। मुझे अपने डेटाबेस के लिए यह त्रुटि मिल रही थी क्योंकि इसमें टाइमशिफ्टेड मान (एन्क्रिप्शन उद्देश्यों के लिए) हैं।
कार्तिकस

इसके अलावा, 5.5 के नीचे mysql के संस्करणों पर DEFAULT मान के साथ DATETIME के ​​साथ एक समस्या है। dba.stackexchange.com/questions/132951/…
वेलारो

47

आवेदन पर निर्भर करता है, वास्तव में।

संघाई में नियुक्ति के लिए एक उपयोगकर्ता द्वारा न्यूयॉर्क में एक सर्वर पर टाइमस्टैम्प स्थापित करने पर विचार करें। अब जब उपयोगकर्ता संघाई में जुड़ता है, तो वह टोक्यो में एक मिरर किए गए सर्वर से समान नियुक्ति टाइमस्टैम्प का उपयोग करता है। वह टोक्यो समय में नियुक्ति देखेंगे, मूल न्यूयॉर्क समय से ऑफसेट।

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

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

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


आपके एप्लिकेशन को सर्वर के टाइमज़ोन पर भरोसा नहीं करना चाहिए। किसी भी क्वेरी को जारी करने से पहले उपयोग किए जाने वाले डेटाबेस कनेक्शन के सत्र में एक एप्लिकेशन को हमेशा समयक्षेत्र का चयन करना चाहिए। यदि एक कनेक्शन कई उपयोगकर्ताओं (उदाहरण: वेबएप) के बीच साझा किया जाता है, तो UTC का उपयोग करें और रेंडरिंग पक्ष पर टाइमज़ोन रूपांतरण करें।
dolmen

42

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

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

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

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


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


8
आपका डेटा आपके सर्वर की समय क्षेत्र सेटिंग्स से जुड़ा नहीं होना चाहिए। हो सकता है, यह आपके लिए काम कर रहा हो अगर आपके पास सिंगल डेस्क बॉक्स आपके डेस्क के नीचे है
जिन

@ जीन यूटीसी का मतलब टाइमस्टैम्प की तरह टाइमजोन नहीं है। यदि आपके सभी सर्वर UTC में हैं, तो कोई समस्या नहीं है। यदि आपके पास 2000 का कॉन्फिगर है, तो शायद यह आपके लिए काम नहीं कर रहा है।
सेबेस्टियन होरिन

TIMESTAMP को भविष्य में 64 बिट मान में अपग्रेड किया जा सकता है। फिर और कोई समस्या नहीं है।
दुगना

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

1
सर्वर के time_zone पर अपने आवेदन में भरोसा न करें। इसके बजाय प्रत्येक डेटाबेस कनेक्शन पर उपयोग करने के लिए time_zone को परिभाषित करें: SET time_zone = '+0:00';UTC के लिए।
डोलमेन

37

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

"बड़े" डेटाबेस शब्दों में, timestampइस पर विशेष-केस ट्रिगर के एक जोड़े हैं।

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


6
नहीं, अंतर केवल "एक विशेष मामले" का नहीं है। क्योंकि सत्र के टाइमज़ोन जो मान सेट / क्वेरी करते हैं वे अलग-अलग शामिल होते हैं।
dolmen

मुझे खुशी है कि आपने "क्या सही है यह पूरी तरह से उस पर निर्भर करता है जो आप करना चाहते हैं।" एसई पर उस स्थिति के बहुत सारे जवाब हैं, पर्याप्त औचित्य के बिना, "आपको कभी भी एक्स नहीं करना चाहिए " या "आपको हमेशा वाई करना चाहिए "।
एजी हैमरथिफ़

37

TIMESTAMP हमेशा UTC में होता है (अर्थात 1970-01-01 से, UTC में सेकंड समाप्त हो जाता है), और आपका MySQL सर्वर इसे कनेक्शन टाइमज़ोन के लिए दिनांक / समय में ऑटो-कन्वर्ट कर देता है। लंबी अवधि में, TIMESTAMP जाने का रास्ता है क्योंकि आप जानते हैं कि आपका अस्थायी डेटा हमेशा UTC में रहेगा। उदाहरण के लिए, यदि आप किसी भिन्न सर्वर पर माइग्रेट करते हैं या यदि आप अपने सर्वर पर टाइमज़ोन सेटिंग्स बदलते हैं तो आप अपनी तिथियों को खराब नहीं करेंगे।

नोट: डिफ़ॉल्ट कनेक्शन टाइमज़ोन सर्वर टाइमज़ोन है, लेकिन इसे प्रति सत्र (देखें SET time_zone = ...) बदला जा सकता है ।


29

DATETIME, TIMESTAMP और DATE के बीच तुलना

यहां छवि विवरण दर्ज करें

वह क्या है [?

  • DATETIME या TIMESTAMP मान में माइक्रोसेकंड (6 अंक) तक सटीक अनुगामी भिन्न भाग शामिल हो सकते हैं। विशेष रूप से, DATETIME या TIMESTAMP कॉलम में डाले गए मान का कोई भी अंश आंशिक रूप से खारिज होने के बजाय संग्रहीत होता है। यह वैकल्पिक है।

सूत्रों का कहना है:


24

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

on update CURRENT_TIMESTAMP

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


23

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

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


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

वहाँ नहीं दिखाया गया है कि MySQL में छंटनी php की तुलना में धीमी है?
sdkfasldf

अच्छी तरह से यह निर्भर करता है, कभी-कभी इसका उपयोग करना अच्छा होता है जब हम स्ट्रेटोटाइम का उपयोग नहीं करना पसंद करते हैं। (php5.3 dep)
एडम

जरूरत पड़ने पर FROM_UNIXTIME का उपयोग करके आप mysql में तर्क को आगे बढ़ा सकते हैं
inarilo

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

17

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

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

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

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

15

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

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

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


आप हमेशा SET time_zone = '+0:00';(यूटीसी के साथ ) सत्र स्तर TIMESTAMPपर टाइमजोन को परिभाषित कर सकते हैं ( यहां यूटीसी) यह सुनिश्चित करने के लिए कि आपको क्या मिलता है / मूल्यों से निर्धारित होता है और सर्वर time_zone डिफ़ॉल्ट पर निर्भर करता है जो बदल सकता है।
डोलमेन

14

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

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

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


14

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

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

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

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

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

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


20 जनवरी 2038 आने पर आपके आवेदन का समर्थन करने वाले व्यक्ति के लिए टाइमस्टैम्प डेटा मज़ेदार होगा। टिक टूक टिक टिक
विल्सन हक

टाइमस्टैम्प प्रकार को थोड़ा बढ़ाया जा सकता है और संभावित मूल्यों को दोगुना किया जा सकता है।
रोजर कैंपानेरा

अपने सिद्धांत को 'थोड़ा बढ़ाएं' परखें और देखें कि क्या आप 1 फरवरी, 2038 को सफलतापूर्वक स्टोर कर सकते हैं और इसे MySQL के साथ पुनः प्राप्त कर सकते हैं। कृपया समाप्त होने पर अपनी तालिका परिभाषा देखें। आप शायद फरवरी, 2038 में बहुत दुखी पिछले परिचितों के लिए जा रहे हैं।
विल्सन हक

1
@WilsonHauck आपको वैसे भी 2038 से पहले MySQL संस्करण को अपग्रेड करना होगा। और उस विस्तारित TIMESTAMP को माइग्रेशन द्वारा नियंत्रित किया जाएगा। इसके अलावा, बंधक को संभालने के अलावा कुछ अनुप्रयोगों को वास्तव में अभी 2038 देखभाल करने की आवश्यकता है।
डोलमेन

@dolmen बहुत सारे पेशेवर-श्रेणी के उपकरण और सामग्री की 20+ वर्ष की वारंटी है। तो warranties.expires_atआज की तरह कुछ MySQL टाइमस्टैम्प नहीं हो सकता है।
एलेक्सा

13

जब आप किसी तालिका पर अद्यतन कथन करते हैं, तो टाइमस्टैम्प बदलने से सावधान रहें। यदि आपके पास कॉलम 'नाम' (varchar), 'Age' (int), और 'Date_Added' (टाइमस्टैम्प) है और आप निम्नलिखित DML स्टेटमेंट चलाते हैं

UPDATE table
SET age = 30

तब आपके 'Date_Added' कॉलम के प्रत्येक एकल मान को वर्तमान टाइमस्टैम्प में बदल दिया जाएगा।


3
आप अपनी तालिका को कैसे सेट करते हैं इसके आधार पर आप इस व्यवहार को नियंत्रित कर सकते हैं। dev.mysql.com/doc/refman/5.5/en/timestamp-initialization.html
चार्ल्स फाइगा

5
@CharlesFaiga किसी अन्य कॉलम को अद्यतन करने के लिए डिफ़ॉल्ट व्यवहार टाइमस्टैम्प के लिए है। यदि आप टाइमस्टैम्प को उसके मूल मूल्य को बनाए रखना चाहते हैं, तो आपको इसे स्पष्ट रूप से बंद करना होगा
लॉयड बैंक

वो क्या है ?! आप के लिए timstamp स्तंभ सेट किया जाना चाहिएON UPDATE CURRENT_TIMESTAMP
लेखाकार م

यह एक विशेषता है जिसे आपको तालिका बनाते समय स्पष्ट रूप से सक्षम करना होगा।
डोलमेन

13

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

मुख्य अंतर:

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

TIMESTAMP अलग-अलग TIME ZONE संबंधित सेटिंग से भी प्रभावित होता है। DATETIME स्थिर है।

TIMESTAMP ने वर्तमान समय क्षेत्र को संग्रहण के लिए UTC में बदल दिया, और पुनर्प्राप्ति के दौरान वर्तमान समय क्षेत्र में वापस परिवर्तित कर दिया। DATETIME ऐसा नहीं कर सकता।

TIMESTAMP समर्थित रेंज: '1970-01-01 00:00:01' UTC से '2038-01-19 03:14:07 IME UTC DATETIME समर्थित रेंज:' 1000-01-01 00:00:00 range से '9999 तक -12-31 23:59:59 :59


11
+---------------------------------------------------------------------------------------+--------------------------------------------------------------------------+
|                                       TIMESTAMP                                       |                                 DATETIME                                 |
+---------------------------------------------------------------------------------------+--------------------------------------------------------------------------+
| TIMESTAMP requires 4 bytes.                                                           | DATETIME requires 8 bytes.                                               |
| Timestamp is the number of seconds that have elapsed since January 1, 1970 00:00 UTC. | DATETIME is a text displays 'YYYY-MM-DD HH:MM:SS' format.                |
| TIMESTAMP supported range: 1970-01-01 00:00:01 UTC to 2038-01-19 03:14:07 UTC.    | DATETIME supported range: 1000-01-01 00:00:00 to 9999-12-31 23:59:59 |
| TIMESTAMP during retrieval converted back to the current time zone.                   | DATETIME can not do this.                                                |
| TIMESTAMP is used mostly for metadata i.e. row created/modified and audit purpose.    | DATETIME is used mostly for user-data.                                   |
+---------------------------------------------------------------------------------------+--------------------------------------------------------------------------+

10

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


8
यह स्पष्ट रूप से गलत है। यहाँ एक उदाहरण है: CREATE TABLE t2 ( ts1 TIMESTAMP NULL, ts2 TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP); पहला कॉलम NULL मान स्वीकार कर सकता है।
ओरमोज़

10

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

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


9

प्रमुख अंतर है

डेटाटाइम इंडेक्सिंग की समस्याओं को देखने के लिए इस पोस्ट को देखें


6
यदि आप स्तंभ मान के आधार पर किसी फ़ंक्शन के साथ चयन कर रहे हैं, और दोनों को अनुक्रमित किया जा सकता है, तो दोनों का एक ही मुद्दा है।
मार्कस एडम्स

4
सूचकांक टाइमस्टैम्प पर काम करता है और डेटाटाइम पर काम नहीं करता है? आपने उन पदों से गलत निष्कर्ष निकाले।
सलमान ए

9

मैंने datetimeसमय क्षेत्र से संबंधित कई समस्याओं और बगों का सामना करने के बाद अपने अनुप्रयोगों में उपयोग करना बंद कर दिया । आईएमएचओ का उपयोग ज्यादातर मामलों में timestampबेहतर हैdatetime

जब आप पूछते हैं कि समय क्या है? और जवाब '2019-02-05 21:18:30' की तरह आता है, जो पूरा नहीं हुआ है, परिभाषित जवाब नहीं क्योंकि इसमें एक और भाग की कमी है, जिसमें टाइमज़ोन है? वाशिंगटन? मास्को? बीजिंग?

समयक्षेत्र के बिना डेटाटाइम का उपयोग करने का मतलब है कि आपका आवेदन केवल 1 टाइमज़ोन के साथ काम कर रहा है, हालांकि टाइमस्टैम्प आपको datetimeविभिन्न टाइमज़ोन में समय के समान सटीक बिंदु दिखाने के लचीलेपन के लाभ देता है।

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

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

    SET time_zone = '+2:00';
  2. आपने उस देश को बदल दिया जिसमें आप रहते हैं और डेटा को बनाए रखने का अपना काम जारी रखते हैं जबकि इसे एक अलग समय-क्षेत्र (वास्तविक डेटा को बदले बिना) में देखते हैं।

  3. आप दुनिया भर के विभिन्न ग्राहकों से डेटा स्वीकार करते हैं, उनमें से प्रत्येक अपने समयक्षेत्र में समय सम्मिलित करता है।

संक्षेप में

datetime = आवेदन 1 टाइमज़ोन का समर्थन करता है (डालने और चयन दोनों के लिए)

timestamp = आवेदन किसी भी समयक्षेत्र का समर्थन करता है (डालने और चयन दोनों के लिए)


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


क्या होगा अगर वहाँ फ़ील्ड है जो उपयोग करते हैं date, और अन्य फ़ील्ड timestampएक तालिका में उपयोग करते हैं । मुझे लगता है कि यह एक नई समस्या का कारण बनेगा क्योंकि जो डेटा फ़िल्टर किया whereजाता है वह टाइमज़ोन परिवर्तनों के अनुसार नहीं है।
एरलांग पी

@ErlangP इस मामले में आपके आवेदन को dateक्वेरी भेजने से पहले कॉलम पर टाइमज़ोन समस्या को ठीक करना चाहिए ।
एकाउंटेंट एन

7

मैं टाइमस्टैम्प का उपयोग करना पसंद करता हूं ताकि सब कुछ एक सामान्य कच्चे प्रारूप में रखा जा सके और डेटा को PHP कोड या आपकी SQL क्वेरी में प्रारूपित किया जा सके। ऐसे उदाहरण हैं जहां यह आपके कोड में सादे सेकंड में सब कुछ रखने के लिए काम आता है।



6

मुझे यूनिक्स टाइमस्टैम्प पसंद है, क्योंकि आप संख्याओं में बदल सकते हैं और बस संख्या के बारे में चिंता कर सकते हैं। इसके अलावा आप जोड़ / घटाना और अवधि प्राप्त करना, आदि तो परिणाम को दिनांक जो भी स्वरूप में परिवर्तित करें। यह कोड पता करता है कि किसी दस्तावेज़ से टाइमस्टैम्प और वर्तमान समय के बीच मिनटों में कितना समय बीत गया।

$date  = $item['pubdate']; (etc ...)
$unix_now = time();
$result = strtotime($date, $unix_now);
$unix_diff_min = (($unix_now  - $result) / 60);
$min = round($unix_diff_min);

4
या, एक मानव पठनीय और मूल MySQL डेटाटाइम का उपयोग करें, और डेटासेटाइम जोड़ने / प्रतिस्थापित करने के लिए देशी MySQL फ़ंक्शन का उपयोग करें।
जुलिएन पैलार्ड
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.