2010-02-02 25 views
24

MySQL, kayıtlı bir UTC saatini yerel saat dilimine dönüştürür: normal zaman ifadesinde doğrudan zamanlama süresi?MySQL, kayıtlı bir UTC saatini yerel saat dilimine dönüştürebilir mi?

Zaman çizelgesiyle (UTC) bazı verileriniz olduğunu varsayalım.

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`) 
) 

Sonra

"select value, date from SomeDateTable"; 

Ben tabii ki onların saklı UTC şeklinde olduğu tüm tarihleri ​​olsun.

Ama başka bir saat diliminde (DST ile) sahip olmak istediğimi varsayalım, sonra seçili zaman dilimi içinde tüm tarihleri ​​geri alabilmek için seçim sorgusuna bir büyü ekleyebilir miyim?

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

Veya bunu başka bir katmanda, bazı php kodlarında olduğu gibi yapmalı mıyım? (çoğu insanın bu sorunu nasıl çözdüğü anlaşılıyor).

Teşekkür Johan


MySQL kurulum bunu bir çok temiz bir çözümdür CONVERT_TZ kullanmanıza izin veriyorsa

, bu örnek nasıl kullanılacağını gösterir.
SELECT CONVERT_TZ('2010-01-01 12:00', 'UTC', 'Europe/Stockholm') 

Ancak bu, bazı MySQL kurulum dikkatle kullanmak, bu işlevi eksik olduğu için iyi bir yol olup olmadığını bilmiyorum.

cevap

1

Bir DATETIME veri türüne neler yapılabileceğini matematik emin değilim, ama PHP kullanıyorsanız, şiddetle tamsayı tabanlı damgaları kullanılması önerilir. Temel olarak, veritabanında PHP'nin time() işlevini kullanarak 4 baytlık bir tam sayı kaydedebilirsiniz. Bu, üzerinde matematik yapmayı çok daha kolay hale getirir.

+0

Convert_tz, benim soruma cevaptı, ama belki de bunun için php kullanacağım ...Sitemi barındırdığım sunucu da o saat dilimi verilerini kaçırdığı için (ve orada düzeltemiyorum ...) – Johan

3

Ben

SET time_zone = 'proper timezone'; 

kez hemen sonra veritabanına bağlanmak yapılıyor kullanmayı öneriyoruz. ve bundan sonra tüm zaman damgaları, bunları seçerken otomatik olarak dönüştürülür.

+10

Bunun otomatik olarak DATE, TIME ve DATETIME alanlarını dönüştürmeyeceğini unutmayın. Bu sadece TIMESTAMP alanları için otomatik dönüşüm yapar ve NOW() ve CURDATE() işlevlerinin sonuçlarını etkiler. – Tom

+0

Bunun kalıcı olmasını istiyorsanız, time_zone parametresini de değiştirebilirsiniz. – jamsandwich

12

"Amerika/Denver" veya "GMT" gibi insan dostu saat dilimlerini kullanmak için mysql ortamını yapılandıramayan (örneğin SUPER erişiminden dolayı) yapılamayanlar için bu işlevi aşağıdaki gibi sayısal ofsetlerle kullanabilirsiniz: zaman sadece (şimdi convert_tz ((), @@ session.time_zone, '+ 03:00')) zaman kullanmak olsun için

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

+4

Bu saat dilimi Yaz saati uygulamasına sahipse (http://www.timeanddate.com/time/dst/), farklı ofset sommer ve kışın olacağından çalışmaz ve 30 dk DST ile bazı örnekler de vardır. – Johan

+0

ilginç .. benim durumumda PHP'den birkaç sorgu çalıştırmak zorundayım ve PHP'deki sonuçlarla herhangi bir TZ işleminde bulunmak istemiyorum, ancak select sorgusundaki sayısal değeri kolayca değiştirebiliyordum. Teşekkürler – tmsimont

4

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

İlgili konular