في الخلية تعويض caculating لمنطقة زمنية
سؤال
هل هناك طريقة في الخلية لحساب تعويض عن أي توقيت؟
على سبيل المثال، للحصول على التوقيت المحلي في Asia/calcutta
التوقيت. ما أريد القيام به هو حساب الإزاحة لهذا التوقيت وأضيف أن تعويض لGMT للحصول على التوقيت المحلي.
المحلول
إذا كنت تريد حساب إزاحة منطقة زمنية مثل أمريكا / فانكوفر من UTC يمكنك أن تفعل ذلك على النحو التالي:
SELECT (unix_timestamp() - unix_timestamp(convert_tz(now(), 'Etc/UTC', 'America/Vancouver'))) / 3600 as offset;
لهذا العمل سوف تحتاج أولا لتحميل معلومات المنطقة الزمنية في الخلية كما هو موضح هنا: <لأ href = "http://dev.mysql.com/doc/refman/5.0/en/mysql-tzinfo- لsql.html "يختلط =" noreferrer "> http://dev.mysql.com/doc/refman/5.0/en/mysql-tzinfo-to-sql.html
نصائح أخرى
وSELECT TIMESTAMPDIFF(HOUR, UTC_TIMESTAMP(), NOW());
إذا توقيت الخادم هو PST هذا سيعود -8
.
وSELECT TIMESTAMPDIFF(SECOND, NOW(), UTC_TIMESTAMP());
وإضافة على ما تقدم على أي الطابع الزمني يونكس إذا كنت ترغب في ذلك لمقارنة DateTimes الخلية.
والإزاحة سيعتمد على الوقت الذي كنت مهتما - على سبيل المثال، كنت قد حاليا إزاحة ساعة واحدة من UTC، ولكن خلال فصل الشتاء بلدي تعويض سيكون الصفر
. وإذا حكمنا من خلال مستندات الصفحة على الخلية الوقت دعم المنطقة ، التي تريد استخدامها في وظيفة convert_tz
. إذا كنت تحاول تحويل UTC إلى التوقيت المحلي، تمر في "الخ / GMT + 0" ب "من" المنطقة الزمنية، و "آسيا / كالكوتا" ب "إلى".
SELECT TIME_FORMAT(TIMEDIFF(NOW(), CONVERT_TZ(NOW(), 'Asia/Calcutta', 'UTC')), '%H:%i') AS offset;
وإعطاء
+--------+
| offset |
+--------+
| 05:30 |
+--------+
وأنا اختلطت أجوبةColinM وKenneth سبنسر لأنني أردت الإزاحة من التوقيت التعسفي في ساعات:
TIMESTAMPDIFF(HOUR, UTC_TIMESTAMP(), CONVERT_TZ(UTC_TIMESTAMP(), "UTC", "America/Denver"))
-
SELECT ROUND(TIMESTAMPDIFF(MINUTE, UTC_TIMESTAMP(), CONVERT_TZ(UTC_TIMESTAMP(), "Etc/UTC", "Asia/Kolkata"))/60,1)
وكما أشار كينيث خارج ستحتاج لتحميل معلومات زمنية: <لأ href = "http://dev.mysql.com/doc/refman/5.0/en/mysql-tzinfo-to-sql.html" يختلط = "نوفولو"> http://dev.mysql.com/doc/refman/5.0/en/mysql-tzinfo-to-sql.html
ولكن بعد ذلك يمكنك أن تفعل أشياء ممتعة مثل العثور على تعويض عن المناطق الزمنية متعددة في وقت واحد:
SELECT Name,
TIMESTAMPDIFF(HOUR, UTC_TIMESTAMP(), CONVERT_TZ(UTC_TIMESTAMP(), "Etc/UTC", Name)) as Offset
FROM mysql.time_zone_name
WHERE (Name IN ('America/Vancouver', 'Etc/UTC', 'America/Denver'))
والعطاء:
+-------------------+--------+
| Name | Offset |
+-------------------+--------+
| America/Denver | -6 |
| America/Vancouver | -7 |
| Etc/UTC | 0 |
+-------------------+--------+
DATEDIFF(NOW(), UTC_TIMESTAMP())
SET time_zone = '-07:00';
ويمكنك تمرير فقط في إزاحة
http://dev.mysql.com /doc/refman/5.1/en/time-zone-support.html
وأنا أتساءل عما إذا كان @ ColinM في الجواب أعلاه هو آمن. هل قراءة عقارب الساعة مرة واحدة أو مرتين؟ هل هناك أي احتمال أن UTC_TIMESTAMP () وNOW () يمكن أن تكون ثانية واحدة على حدة؟ أنا لا أعرف ولكن هذا من شأنه تجنب ذلك.
SET @now = now();
SET @utc = CONVERT_TZ(@now, 'SYSTEM', '+00:00');
SELECT TIMESTAMPDIFF(MINUTE, @utc, @now);