MySQL सेट UTC समय को डिफ़ॉल्ट टाइमस्टैम्प के रूप में


35

मैं एक टाइमस्टैम्प कॉलम कैसे सेट कर सकता हूं जिसका डिफ़ॉल्ट मूल्य वर्तमान यूटीसी समय है?

MySQL UTC_TIMESTAMP()UTC टाइमस्टैम्प के लिए फ़ंक्शन का उपयोग करता है :

mysql> SELECT UTC_TIMESTAMP();
+---------------------+
| UTC_TIMESTAMP()     |
+---------------------+
| 2012-07-01 11:36:35 |
+---------------------+
1 row in set (0.00 sec)

इसलिए मैंने कोशिश की है:

CREATE TABLE `blah` (
`creation_time` TIMESTAMP DEFAULT UTC_TIMESTAMP,
...

और अन्य विविधताएं, जैसे UTC_TIMESTAMP(), लेकिन सफलता के बिना।


क्या आपने कोशिश की CURRENT_TIMESTAMP?
ypercube y

1
यह काम करता है, लेकिन यह UTC के बजाय एक स्थानीय समयक्षेत्र मूल्य को संग्रहीत नहीं करता है।
एडम मटन जूल

वास्तव में आप क्या करना चाहते हैं? UTC टाइमस्टैम्प तालिका तालिका में संग्रहीत करें? या कुछ और?
ypercube y

8
से दिनांक, DATETIME, और टाइमस्टैम्प प्रकार :MySQL converts TIMESTAMP values from the current time zone to UTC for storage, and back from UTC to the current time zone for retrieval.
ypercubeᵀᴹ

3
ध्यान रखें कि UTC के रूप में संग्रहण केवल TIMESTAMP डेटाटाइप पर लागू होता है, DATE और DATETIME के ​​लिए नहीं (हालाँकि आप उनके डिफ़ॉल्ट सेट कर सकते हैं CURRENT_TIMESTAMP)। उसी प्रलेखन पृष्ठ से (This does not occur for other types such as DATETIME.):।
एरोनानअमर्स

जवाबों:


49

CURRENT_TIMESTAMPUTC के रूप में संग्रहीत @ ypercube की टिप्पणी के साथ जाने के लिए, लेकिन वर्तमान समयक्षेत्र के रूप में पुनर्प्राप्त, आप पुनर्प्राप्ति के लिए --default_time_zone विकल्प के साथ अपने सर्वर के समयक्षेत्र सेटिंग को प्रभावित कर सकते हैं । इससे आपकी पुनर्प्राप्ति हमेशा यूटीसी में हो सकती है।

डिफ़ॉल्ट रूप से, विकल्प 'सिस्टम' है जो आपके सिस्टम टाइम ज़ोन को सेट करता है (जो कि यूपीआई हो सकता है या नहीं भी हो सकता है!)।

mysql> SELECT @@global.time_zone, @@session.time_zone;
+--------------------+---------------------+
| @@global.time_zone | @@session.time_zone |
+--------------------+---------------------+
| SYSTEM             | SYSTEM              |
+--------------------+---------------------+
1 row in set (0.00 sec)

mysql> SELECT CURRENT_TIMESTAMP();
+---------------------+
| CURRENT_TIMESTAMP() |
+---------------------+
| 2012-09-25 16:28:45 |
+---------------------+
1 row in set (0.00 sec)

आप इसे गतिशील रूप से सेट कर सकते हैं:

mysql> SET @@session.time_zone='+00:00';
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT @@global.time_zone, @@session.time_zone;
+--------------------+---------------------+
| @@global.time_zone | @@session.time_zone |
+--------------------+---------------------+
| SYSTEM             | +00:00              |
+--------------------+---------------------+
1 row in set (0.00 sec)

या स्थायी रूप से आपके my.cnf में:

[mysqld]
**other variables**
default_time_zone='+00:00'

अपने सर्वर को पुनरारंभ करें, और आप परिवर्तन देखेंगे:

mysql> SELECT @@global.time_zone, @@session.time_zone;
+--------------------+---------------------+
| @@global.time_zone | @@session.time_zone |
+--------------------+---------------------+
| +00:00             | +00:00              |
+--------------------+---------------------+
1 row in set (0.00 sec)

mysql> SELECT CURRENT_TIMESTAMP();
+---------------------+
| CURRENT_TIMESTAMP() |
+---------------------+
| 2012-09-25 20:27:50 |
+---------------------+
1 row in set (0.01 sec)

2
बहुत ही उपयोगी पोस्ट !!
om39a

क्या default_time_zoneकिसी विशिष्ट तालिका या डेटाबेस के लिए निर्दिष्ट करना संभव है ? धन्यवाद।
WM

2
क्या किसी विशिष्ट क्वेरी के लिए default_time_zone निर्दिष्ट करना संभव है?
mcmillab

@mcmillab आप क्वेरी चलाने से पहले सत्र टाइमज़ोन सेट कर सकते हैं, फिर आगे की क्वेरी (या फिर से कनेक्ट) चलाने से पहले ग्लोबल टाइमज़ोन पर रीसेट कर सकते हैं।
डेरेक डाउनी

Mcmillab के बाद - या उस ऑपरेटर के साथ कॉलम को क्वेरी करने के लिए जो अंतर्निहित UTC मान दिखाता है (चूंकि रूपांतरण 1-to1 नहीं है)?
मार्क एल।

4

आप UTC_TIMESTAMPस्वचालित गुणों को निर्दिष्ट करने के लिए डिफ़ॉल्ट के रूप में निर्दिष्ट नहीं कर सकते हैं, आपको केवल DEFAULT CURRENT_TIMESTAMPऔर ON UPDATE CURRENT_TIMESTAMPखंड का उपयोग करना चाहिए ।

इसके अलावा, आप UTC_TIMESTAMPतालिका के लिए इस तरह से मान शामिल कर सकते हैं :

CREATE TABLE `test` (
  `ts` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);

UTC_TImeSTAMP सम्मिलित करने के लिए INSERT क्वेरी इस तरह होगी:

insert into `test` (`ts`) 
values
  (utc_timestamp()) ;

"आप स्वत: गुण निर्दिष्ट करने के लिए डिफ़ॉल्ट के रूप में UTC_TIMESTAMP निर्दिष्ट नहीं कर सकते" के लिए धन्यवाद
Barbaros अल्प

4

मेरा समाधान ट्रिगर के साथ है:

DELIMITER //
CREATE TRIGGER `update_to_utc` BEFORE INSERT ON `my_table` FOR EACH ROW BEGIN
set new.my_field=utc_timestamp();
END//
DELIMITER ;

फिर प्रत्येक नई सम्मिलित पंक्ति में UTC में टाइमस्टैम्प होगा।


1

mariadb के लिए केवल वैश्विक my.cnf समाधान ने काम किया

mariadb 10.2 के लिए, इस पोस्ट में @Derek डाउनी का स्थायी समाधान।

[mysqld]
**other variables**
default_time_zone='+00:00'

mariadb 10.0 के लिए (मेरे पास 10.0.32 था), https://stackoverflow.com/questions/947299/how-do-i-make-mysqls-now-and-curdate-functions-use.utc देखें

[mysqld_safe]
**other variables**
timezone = UTC

दोनों परिभाषाएं madadb 10.2 के my.cnf में सह-अस्तित्व में हो सकती हैं, लेकिन मेरे पास अब mariadb 10.0 नहीं है।

आशा है कि यह आपकी मदद करेगा।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.