2013-08-07 18 views
5

MySQL (InnoDB) DB'mizdeki bazı TIMESTAMP alanlarını INT'ye dönüştürmem gerekiyor. Bir TIMESTAMP'ı INT'ye dönüştürmenin sıra dışı olduğunu, ancak yine de bunu yapmamız gerektiğini anlıyorum.Mysql TIMESTAMP - INTEGER - zaman dilimleri

Yapacak kadar ileri görünüyor, ancak bazı saat dilimi ve gün ışığından yararlanma hataları var.

Sütun başına SQL kodumu üreten bir komut dosyası var. Örneğin, oluşturur:

ALTER TABLE alarmLog ADD COLUMN started_tmp INT UNSIGNED; 
UPDATE alarmLog SET started_tmp = UNIX_TIMESTAMP(started); 
ALTER TABLE alarmLog DROP started; 
alter TABLE alarmLog CHANGE started_tmp started INT UNSIGNED NULL DEFAULT 0; 

önce ve, sonuç iyi görünüyor select FROM_UNIXTIME(1291788036); kullanarak veri sonra karşılaştırırsanız. Buradaki fikir, tüm istemci tarafı yazılımlarını UTC'ye dönüştürmek ve depolarken bu INT'yi kullanmaktır. Alınırken, bu INT geçerli saat dilimine dönüştürülür. Bu senaryo hakkında

Ama sonra docs warn me (CET içerisindeki Gün ışığından):

mysql> SELECT UNIX_TIMESTAMP('2005-03-27 02:00:00'); 
+---------------------------------------+ 
| UNIX_TIMESTAMP('2005-03-27 02:00:00') | 
+---------------------------------------+ 
|       1111885200 | 
+---------------------------------------+ 
1 row in set (0.00 sec) 

mysql> SELECT UNIX_TIMESTAMP('2005-03-27 03:00:00'); 
+---------------------------------------+ 
| UNIX_TIMESTAMP('2005-03-27 03:00:00') | 
+---------------------------------------+ 
|       1111885200 | 
+---------------------------------------+ 
1 row in set (0.00 sec) 

nasıl API ve işletim sistemleri normalde Gün ışığından ile anlaşma yapmak? Bilgisayarımın UTC'de ve yaz saatinde saati olduğunu biliyorum, OS buna iki saat ve kış aylarında bir tane ekler. DST olup olmadığını belirlemek için UTC zamanını kullandığını farz ediyorum.

Peki, bununla nasıl baş edebilirim? DST sapmasını belirtmek için veritabanına bir alan eklemek için tek çözüm mü?

+1

Yaz saati farklı bir saat dilimidir. Örneğin. CET Orta Avrupa Saati, CEST Orta Avrupa Yaz Saati. İşletim sisteminiz ne zaman değiştirileceğini biliyor. Zaman damgaları için UTC kullandığınız sürece, bunu yerel zamana dönüştürmek için sunum katmanına kalmıştır. –

cevap

3

Saati INT'lerde depolamanıza gerek yoktur. MySQL'in TIMESTAMP tipi zaten bunu yapar (zamanı kaydetmek için standart unix zaman damgasını kullanır) ve her zaman UTC'de bulunurlar.

Sadece oturum zaman dilimini ayarlamalısınız ve bunları güncellediğinizde/seçtiğinizde tüm TIMESTAMP sütunları bölgenize/bölgenize dönüştürülecektir.

Bir kez bağlantı/başlatma zaman dilimini ayarlayabilirsiniz:

SET time_zone = '+10:00'; 

Ve sonra doğrudan

SELECT timesamp_column FROM table ... 

Ben çok aşina değilim/seçmek için diliminde güncelleyebilir datetime libs ancak sağladığınız zaman dilimini ve zaman dilimini ve gün ışığından yararlanma ofsetlerini belirlemek için söz konusu süreyi kullanırlar.

Sağladığınız örnekte, değerlerden birinin aslında geçersiz olduğunu düşünüyorum çünkü saatin 01:59:59 ile 03:00:00 ve 02:00:00 arasında atlayacağını varsayalım. UNIX_TIMESTAMP işlevi muhtemelen bu durumda en yakın ikinci değerini döndürür.

+0

Zaman damgalarını kullanabileceğimi biliyorum, ancak bu türü kullanamıyorum. İstemci tarafının sqlite ile uyumlu olması, dolayısıyla INT'ye dönüştürülmesi gerekir. Ve geçersiz zaman hakkında; Gün ışığından sonra size günde iki kez belirli bir zaman kazandırır, ki bu da aynı soruna neden olur. – Halfgaar

+0

Aynı dize gösterimi ile zaman içinde birden çok nokta vardır ve boşluklar da vardır. Bunun hakkında yapabileceğiniz bir şey olduğunu düşünmüyorum. Değerlerinizi unix zaman damgası (INT) olarak saklayın ve bunları MySQL'in işlevleri veya zaman kütüphanesi istemci tarafı ile yerel saate dönüştürün. Zaman dilimini düzgün ayarladığınız sürece doğru şekilde görüntülenmelidir. – Vatev

+0

Sadece TIMESTAMP sütununa '2005-03-27 02:00:00' eklemeyi test ettim. Onu almanız da size '2005-03-27 03:00:00' verir, bu yüzden iyi olur. – Halfgaar