سؤال

هل هناك طريقة في الخلية لحساب تعويض عن أي توقيت؟ على سبيل المثال، للحصول على التوقيت المحلي في 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);
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top