आपने यह टाइम-डायग्नोस्टिक क्वेरी अपने MySQL सर्वर पर चलाई।
select @@time_zone, now(), utc_timestamp()
आपके स्थानीय समय और यूटीसी समय से यह स्पष्ट है कि आपकी सर्वर मशीन की सिस्टम टाइम ज़ोन सेटिंग 'कनाडा/माउंटेन' है, और MySQL सर्वर सॉफ़्टवेयर की अपनी टाइमज़ोन सेटिंग नहीं है।
यदि आप अपनी टेबल उठाते हैं और उन्हें किसी पास के समय क्षेत्र में सर्वर पर अपरिवर्तित ले जाते हैं, तो आप आदेश जारी करने के लिए अपने सॉफ़्टवेयर को हमेशा अपडेट कर सकते हैं
set time_zone = 'Canada/Mountain';
अपने सॉफ़्टवेयर से कनेक्ट होने के ठीक बाद। यह आपका नया MySQL कनेक्शन व्यवहार करेगा जैसे आपका वर्तमान समय-क्षेत्र-वार करता है। यदि आप MySQL सर्वर के स्वामी हैं, तो आप इस पृष्ठ पर दिए निर्देशों के अनुसार इसका डिफ़ॉल्ट समय क्षेत्र निर्धारित कर सकते हैं। http://dev.mysql.com/doc /refman/5.5/hi/time-zone-support.html
अब, यहाँ समय डेटा प्रकारों के बारे में कहानी है। DATE
, TIME
, और DATETIME
सभी समय क्षेत्र से अनजान . हैं . एक बार जब आप किसी दिनांक/समय मान को संग्रहीत कर लेते हैं, तो आप उसे वही मान वापस प्राप्त कर सकते हैं, भले ही आप अपनी समय क्षेत्र सेटिंग बदल दें।
TIMESTAMP
डेटा प्रकार समय-क्षेत्र-संवेदनशील है . वे डेटा आइटम हमेशा UTC, जिसे Z, टाइम के नाम से भी जाना जाता है
में संग्रहित किया जाता है। , जिसे पहले ग्रीनविच मीन टाइम के नाम से जाना जाता था। संग्रहीत होने पर वे हमेशा यूटीसी में परिवर्तित हो जाते हैं, और हमेशा पुनर्प्राप्त होने पर वापस परिवर्तित हो जाते हैं।
बिल्टिन फंक्शन
वर्तमान दिनांक और समय प्राप्त करने के लिए (NOW()
और दोस्त) समय क्षेत्र के प्रति संवेदनशील . हैं . वे स्थानीय समय में मूल्य प्राप्त करेंगे। UTC_
. से शुरू होने वाले तीन फंक्शन अपवाद हैं जो UTC समय में मान उत्पन्न करते हैं।
कई MySQL बहु-समय-क्षेत्र अनुप्रयोग निम्नलिखित परिचालन अनुशासन का उपयोग करते हैं:
- प्रत्येक उपयोगकर्ता से उपयोगकर्ता-वरीयता समय क्षेत्र के लिए पूछें, या उपयोगकर्ता के बारे में किसी अन्य व्यक्तिगत डेटा से इसका पता लगाएं। (टेलीफोन में यह जानकारी नेटवर्क से उपलब्ध कराई गई है।) इसे zoneinfo-friendly उपयोगकर्ता की ओर से समय क्षेत्र विवरणक ('अमेरिका/न्यूयॉर्क', 'कनाडा/पर्वत', 'यूरोप/वियना', आदि)।
- उपयोगकर्ता की ओर से एक MySQL सत्र स्थापित करने पर, उपयोगकर्ता के समय क्षेत्र को
set time_zone
के साथ सेट करें ऊपर दिखाए गए की तरह क्वेरी। अपनेconnect
. के ठीक बाद आपको यह करना चाहिए ऑपरेशन। - उपयोगकर्ताओं के लिए दिनांक और समय को
TIMESTAMP
में स्टोर करें डेटा के प्रकार। संग्रहीत होते ही वे यूटीसी में परिवर्तित हो जाएंगे। - आवश्यकतानुसार उन्हें पुनः प्राप्त करें। वे वापस स्थानीय समय में परिवर्तित हो जाएंगे।
विचार यह है कि आपके उपयोगकर्ता का समय क्षेत्र उसके संदर्भ का हिस्सा है। यह अच्छी तरह से काम करता है, क्योंकि यदि उपयोगकर्ता ए वैंकूवर में है और उपयोगकर्ता बी हैलिफ़ैक्स में है, और किसी कारण से उपयोगकर्ता बी उपयोगकर्ता ए के समय डेटा को देखता है, तो यह अटलांटिक समय में कम या ज्यादा स्वचालित रूप से बी को दिखाया जाएगा।
यह इसलिए भी अच्छा है क्योंकि यह दिन के उजाले से मानक समय बदलने की वैश्विक अनियमितताओं से पारदर्शी रूप से निपटता है। पिछली गर्मियों का टाइमस्टैम्प पिछली गर्मियों के स्थानीय समय में प्रदर्शित किया जाएगा।
वैश्विक उपयोग के लिए सर्वर के कई प्रबंधक अपने सिस्टम सर्वर समय, या अपने MySQL डिफ़ॉल्ट समय क्षेत्र को UTC पर सेट करते हैं। (आपका नहीं।)
इन सब से निपटने का एक और तरीका है, जिस तरह से आपने शुरुआत की है। एक समय क्षेत्र चुनें और उस समय क्षेत्र के संबंध में अपना टाइमस्टैम्प स्टोर करें। यह सबसे अच्छा है यदि आप एक समय क्षेत्र चुनते हैं जो उस मामले में दिन के उजाले और मानक समय के बीच वैकल्पिक नहीं होता है। फिर, डेटाबेस में समय संग्रहीत करते समय, व्याख्या को रूपांतरित करें। आप कुछ इस तरह से ओटावा में उपयोगकर्ताओं से समय संग्रहित करेंगे।
INSERT INTO tbl (appt) VALUES ( 'whatever-time' - INTERVAL 120 MINUTE)
और आप मूल्यों को उसी तरह प्राप्त करेंगे। यह त्रुटि-प्रवण है लेकिन आप इसे काम कर सकते हैं।
अंत में, आप अपने रूपांतरण स्वयं कर सकते हैं। यदि आप जानना चाहते हैं कि कुछ आर्बिटरी टाइमज़ोन और यूटीसी के बीच कितने मिनट ऑफ़सेट हैं, तो इन दो प्रश्नों को आजमाएं।
set time_zone = 'Canada/Atlantic';
select timestampdiff(minute, utc_timestamp(), now());
साल के इस समय में वह -240 वापस देता है, जो कि -4:00 है। कुछ देशों में आधे घंटे या चौथाई घंटे के टाइमज़ोन ऑफ़सेट के कारण आपको घंटों के बजाय मिनटों का उपयोग करने की आवश्यकता है।
अंत में, सावधान रहें। TIMESTAMP
डेटा प्रकार 1970 से पहले के समय का प्रतिनिधित्व नहीं करते हैं। और, मेरे मारियाडीबी 10.0 उदाहरण पर यह 2038-01-19T03:14:07 यूटीसी के ठीक बाद एक बाल्टी में नरक में जाता प्रतीत होता है, जब समय 32 बिट्स से अधिक हो जाता है।पी>