ist - मैं MySQL का वर्तमान समय क्षेत्र कैसे प्राप्त करूं?




सभी देशों का टाइम (10)

किसी को पता है कि MySQL में ऐसा कोई फ़ंक्शन है या नहीं?

अद्यतन करें

यह किसी वैध जानकारी का उत्पादन नहीं करता है:

mysql> SELECT @@global.time_zone, @@session.time_zone;
+--------------------+---------------------+
| @@global.time_zone | @@session.time_zone |
+--------------------+---------------------+
| SYSTEM             | SYSTEM              |
+--------------------+---------------------+

या हो सकता है कि MySQL स्वयं बिल्कुल time_zone उपयोग नहीं कर time_zone , यह ठीक है, हम यहां PHP शामिल कर सकते हैं, जब तक कि मैं वैध जानकारी प्राप्त नहीं कर सकता, SYSTEM तरह नहीं ...


MySQL के टाइमज़ोन प्रारूप में एक मान प्राप्त करने के लिए LPAD (TIME_FORMAT (TIMEDIFF (NOW (), UTC_TIMESTAMP), '% H:% i'), 6, '+') का उपयोग करें जिसे आप आसानी से CONVERT_TZ () के साथ उपयोग कर सकते हैं। ध्यान दें कि आपके द्वारा प्राप्त टाइमज़ोन ऑफसेट केवल उस समय मान्य है जहां अभिव्यक्ति का मूल्यांकन किया जाता है, क्योंकि यदि आपके पास डेलाइट सेविंग टाइम है तो ऑफ़सेट समय के साथ बदल सकता है। फिर भी अभिव्यक्ति स्थानीय समय के साथ ऑफसेट को स्टोर करने के लिए अब () के साथ उपयोगी है, जो अब () उत्पन्न करता है जो असंगत है। (डीएसटी टाइमज़ोन में, अब () साल में एक बार एक बार वापस कूदता है, इस प्रकार समय में अलग-अलग बिंदुओं के लिए कुछ डुप्लिकेट मान होते हैं)।


MySQL के वर्तमान टाइमज़ोन प्राप्त करने के लिए आप निम्न चीज़ें कर सकते हैं:

  1. SELECT @@ system_time_zone; // इससे आप सिस्टम टाइमज़ोन प्राप्त कर सकते हैं
  2. अगर IF (@@ session.time_zone = 'SYSTEM', @@ system_time_zone, @@ session.time_zone) // यह आपको समय क्षेत्र देगा यदि सिस्टम टाइमज़ोन वैश्विक टाइमज़ोन से अलग है

अब यदि आप MySQL टाइमज़ोन को बदलना चाहते हैं तो: 1. सेट ग्लोबल टाइम_ज़ोन = '+00: 00' // यह यूटीसी 2 में mysql टाइमज़ोन सेट करेगा। SET @@ session.time_zone = "+00: 00"; // इसके द्वारा आप केवल अपने विशेष सत्र के लिए टाइमज़ोन का उपयोग कर सकते हैं


अपने टाइमज़ोन के अनुसार वर्तमान समय प्राप्त करने के लिए, आप निम्न का उपयोग कर सकते हैं (मेरे मामले में इसकी '+5: 30')

DATE_FORMAT का चयन करें (convert_tz (अब (), @@ session.time_zone, '+ 05:30'), '% Y-% m-% d')


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


निम्न कोड का उपयोग करने का प्रयास करें:

//ASP CLASSIC
Set dbdate = Server.CreateObject("ADODB.Recordset")
dbdate.ActiveConnection = MM_connection
dbdate.Source = "SELECT NOW() AS currentserverdate "
dbdate.Open()
currentdate = dbdate.Fields("currentserverdate").Value
response.Write("Server Time is "&currentdate)
dbdate.Close()
Set dbdate = Nothing

नीचे दी गई क्वेरी वर्तमान सत्र का टाइमज़ोन लौटाती है।

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

मेरा PHP ढांचा उपयोग करता है

SET LOCAL time_zone='Whatever'

कनेक्ट करने के बाद, जहां 'जो भी' == date_default_timezone_get

मेरा समाधान नहीं है, लेकिन यह सुनिश्चित करता है कि MySQL सर्वर का SYSTEM टाइमज़ोन हमेशा PHP के समान होता है

तो, हाँ, PHP दृढ़ता से envolved है और इसे प्रभावित कर सकते हैं


मैनुअल से ( सेक्शन 9.6 ):

वैश्विक और क्लाइंट-विशिष्ट समय क्षेत्रों के वर्तमान मूल्य इस तरह से पुनर्प्राप्त किए जा सकते हैं:
mysql> SELECT @@global.time_zone, @@session.time_zone;

उपर्युक्त रिटर्न SYSTEM संपादित करें यदि MySQL सिस्टम के टाइमज़ोन पर गुलाम के लिए सेट है, जो सहायक से कम है। चूंकि आप PHP का उपयोग कर रहे हैं, यदि MySQL का उत्तर SYSTEM , तो आप सिस्टम से पूछ सकते हैं कि यह date_default_timezone_get माध्यम से date_default_timezone_get का उपयोग कर date_default_timezone_get । (बेशक, जैसा कि वोल्करके ने इंगित किया था, PHP एक अलग सर्वर पर चल रहा है, लेकिन धारणाएं चलती हैं, मानते हैं कि वेब सर्वर और डीबी सर्वर जिस पर बात कर रहा है [अगर वास्तव में नहीं है ] एक ही टाइमज़ोन नहीं है भारी छलांग।) लेकिन सावधान रहें (जैसा कि MySQL के साथ), आप date_default_timezone_set सेट कर सकते हैं जो PHP का उपयोग करता है ( date_default_timezone_set ), जिसका अर्थ है कि यह ओएस की तुलना में एक अलग मूल्य की रिपोर्ट कर सकता है। यदि आप PHP कोड के नियंत्रण में हैं, तो आपको पता होना चाहिए कि आप ऐसा कर रहे हैं और ठीक है।

लेकिन MySQL सर्वर का उपयोग करने वाले टाइमज़ोन का पूरा प्रश्न एक स्पर्शक हो सकता है, क्योंकि सर्वर से पूछना कि यह किस समय में है, आपको डेटाबेस में डेटा के बारे में बिल्कुल कुछ नहीं बताता है। विवरण के लिए पढ़ें:

आगे की चर्चा :

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

set time_zone = '+00:00';

यह जीएमटी को टाइमज़ोन सेट करता है, ताकि कोई और ऑपरेशन (जैसे now() ) जीएमटी का उपयोग करेगा।

नोट, हालांकि, उस समय और दिनांक मान MySQL में टाइमज़ोन जानकारी के साथ संग्रहीत नहीं हैं:

mysql> create table foo (tstamp datetime) Engine=MyISAM;
Query OK, 0 rows affected (0.06 sec)

mysql> insert into foo (tstamp) values (now());
Query OK, 1 row affected (0.00 sec)

mysql> set time_zone = '+01:00';
Query OK, 0 rows affected (0.00 sec)

mysql> select tstamp from foo;
+---------------------+
| tstamp              |
+---------------------+
| 2010-05-29 08:31:59 |
+---------------------+
1 row in set (0.00 sec)

mysql> set time_zone = '+02:00';
Query OK, 0 rows affected (0.00 sec)

mysql> select tstamp from foo;
+---------------------+
| tstamp              |
+---------------------+
| 2010-05-29 08:31:59 |      <== Note, no change!
+---------------------+
1 row in set (0.00 sec)

mysql> select now();
+---------------------+
| now()               |
+---------------------+
| 2010-05-29 10:32:32 |
+---------------------+
1 row in set (0.00 sec)

mysql> set time_zone = '+00:00';
Query OK, 0 rows affected (0.00 sec)

mysql> select now();
+---------------------+
| now()               |
+---------------------+
| 2010-05-29 08:32:38 |      <== Note, it changed!
+---------------------+
1 row in set (0.00 sec)

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

यह मानते हुए कि सर्वर के टाइमज़ोन त्रुटिपूर्ण डेटा का उपयोग करके लिखा गया था? खैर, एक बात के लिए, डेटा एक कनेक्शन का उपयोग करके लिखा जा सकता है जो एक अलग टाइमज़ोन सेट करता है। डेटाबेस को एक सर्वर से दूसरे सर्वर पर ले जाया जा सकता है, जहां सर्वर अलग-अलग टाइमज़ोन में थे (जब मैं टेक्सास से कैलिफ़ोर्निया में स्थानांतरित हुआ था, तो उस डेटाबेस में विरासत में आया था)। लेकिन यहां तक ​​कि यदि सर्वर पर डेटा वर्तमान समय क्षेत्र के साथ लिखा गया है, तो यह अभी भी संदिग्ध है। पिछले साल, संयुक्त राज्य अमेरिका में, डेलाइट सेविंग्स टाइम 1 नवंबर को 2:00 बजे बंद कर दिया गया था। मान लीजिए मेरा सर्वर प्रशांत टाइमज़ोन का उपयोग कर कैलिफ़ोर्निया में है और मेरे पास डेटाबेस में 2009-11-01 01:30:00 मान है। यह कब था? क्या 1:30 बजे नवंबर 1 पीडीटी, या 1:30 बजे नवंबर 1 पीएसटी (एक घंटे बाद) था? आपके पास जानने का बिल्कुल कोई तरीका नहीं है। नैतिक: हमेशा जीएमटी में दिनांक / समय जमा करें (जो डीएसटी नहीं करता है) और वांछित टाइमज़ोन में / जब आवश्यक हो।


सिस्टम के टाइमज़ोन को बदलने के बाद आपको बस mysqld को पुनरारंभ करना होगा ..

MySQL का ग्लोबल टाइम जोन सिस्टम का टाइमज़ोन लेता है। जब आप सिस्टम की ऐसी कोई विशेषता बदलते हैं, तो आपको बस माइस्क्ल्ड को पुनरारंभ करने की आवश्यकता होती है।






timezone