2010-02-02 7 views
24

क्या MySQL एक संग्रहीत यूटीसी समय को स्थानीय टाइमज़ॉन में परिवर्तित कर सकता है: एड टाइम सीधे सामान्य चयन कथन में?क्या MySQL संग्रहीत यूटीसी समय को स्थानीय टाइमज़ोन में परिवर्तित कर सकता है?

मान लें कि आपके पास टाइमस्टैम्प (यूटीसी) के साथ कुछ डेटा है।

CREATE TABLE `SomeDateTable` (
    `id` int(11) NOT NULL auto_increment, 
    `value` float NOT NULL default '0', 
    `date` datetime NOT NULL default '0000-00-00 00:00:00', 
    PRIMARY KEY (`id`) 
) 

फिर जब मैं

"select value, date from SomeDateTable"; 

मैं निश्चित रूप से सभी तिथियों उनकी संग्रहीत यूटीसी के रूप में के रूप में मिलता है।

लेकिन कहते हैं कि मैं उन्हें (डीएसटी) के साथ एक और समय क्षेत्र में है करना चाहते हैं, मैं तो कुछ जादू का चयन क्वेरी के लिए इतना है कि मैं सभी तिथियों चयनित समय क्षेत्र में वापस पाने के जोड़ सकते हैं?

"select value, TIMEZONE(date, "Europe/Berlin") from SomeDateTable"; 

या मुझे कुछ पीएचपी कोड की तरह शीर्ष पर किसी अन्य परत में ऐसा करना चाहिए? (ऐसा लगता है कि अधिकांश लोगों ने इस समस्या को हल किया है)।

धन्यवाद जोहान


अपने MySQL स्थापना आप CONVERT_TZ उपयोग करने के लिए यह एक बहुत साफ समाधान है की अनुमति देता है, तो इस उदाहरण यह कैसे उपयोग करने के लिए दिखाता है।

SELECT CONVERT_TZ('2010-01-01 12:00', 'UTC', 'Europe/Stockholm') 

लेकिन अगर यह एक अच्छा तरीका है के बाद से कुछ MySQL स्थापना इस समारोह याद आ रही है, सावधानी से उपयोग करें मैं नहीं जानता।

उत्तर

19
+0

होने के लिए लगता है सही बात है लेकिन मैंने इस बग को मारा सीधे: http://bugs.mysql.com/bug.php?id=12445 मेरे सर्वर में टाइमज़ोन डेटा गुम था ... – Johan

+6

mysql_tzinfo_to_sql/usr/share/zoneinfo | mysql -u रूट mysql – Johan

1

मुझे यकीन है कि क्या गणित एक DATETIME डेटा प्रकार पर किया जा सकता नहीं कर रहा हूँ, लेकिन अगर आप PHP का उपयोग कर रहे हैं, मैं दृढ़ता से पूर्णांक आधारित टाइम स्टांप का उपयोग करें। असल में, आप PHP के समय() फ़ंक्शन का उपयोग कर डेटाबेस में 4-बाइट पूर्णांक स्टोर कर सकते हैं। यह गणित को और अधिक सरल बनाता है।

+0

कन्वर्ट_टीज़ मेरे प्रश्न का उत्तर था, लेकिन हो सकता है कि मैं इसके लिए php का उपयोग करूंगा ...चूंकि जिस सर्वर पर मैं अपनी साइट होस्ट करता हूं वह उस टाइमज़ोन डेटा को भी याद कर रहा था (और वहां मैं इसे ठीक नहीं कर सकता ...) – Johan

3

मैं उपयोग करने के लिए

SET time_zone = 'proper timezone'; 

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

+10

यह ध्यान रखना महत्वपूर्ण है कि यह स्वचालित रूप से DATE, TIME और DATETIME फ़ील्ड को परिवर्तित नहीं करेगा। यह केवल TIMESTAMP फ़ील्ड के लिए स्वचालित रूपांतरण करेगा और अब() और CURDATE() फ़ंक्शंस के परिणामों को प्रभावित करेगा। – Tom

+0

यदि आप इसे स्थायी रखना चाहते हैं, तो आप time_zone पैरामीटर भी बदल सकते हैं। – jamsandwich

12

"अमेरिका/डेनवर" या "जीएमटी" जैसे मानव-अनुकूल टाइमज़ोन नामों का उपयोग करने के लिए MySQL वातावरण (उदाहरण के लिए सुपर एक्सेस की कमी के कारण) को कॉन्फ़िगर करने में असमर्थ लोगों के लिए आप इस तरह के संख्यात्मक ऑफसेट के साथ फ़ंक्शन का उपयोग भी कर सकते हैं:

CONVERT_TZ(date,'+00:00','-07:00')

+4

यह काम नहीं करेगा अगर उस टाइमज़ोन में डेलाइट सेविंग टाइम (http://www.timeanddate.com/time/dst/) है क्योंकि आपके पास अलग ऑफसेट सॉमर और सर्दी होगी, और 30min DST के साथ कुछ उदाहरण भी हैं ... – Johan

+0

दिलचस्प .. मेरे मामले में मुझे PHP से कुछ प्रश्नों को चलाने के लिए है और PHP में परिणामों के साथ कोई भी TZ हैंडलिंग नहीं करना है, लेकिन मैं आसानी से चयन क्वेरी में संख्यात्मक मान को बदल सकता हूं। धन्यवाद – tmsimont

4

select convert_tz(now(),@@session.time_zone,'+03:00')

के लिए मिल समय केवल समय (convert_tz (अब(), @@ session.time_zone, '+ 03:00')) का उपयोग

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