2015-08-04 11 views
5

Unix zaman damgası olarak depolanmış tarihlerimiz var. Bir kullanıcının belirli bir tarih aramasına izin vermek için - saat dilimi ayarına bağlı olarak, "2012-05-03" için bir aramanın önceki/sonraki sonuçları bulamadığından emin olmak için bu zaman damgasını sorguya dönüştürüyorduk Kullanıcının hangi saat dilimine bağlı olduğuna bağlı olarak. 2038-01-19'dan sonra MySQL from_unixtime?

yani bir tarih uygun zaman dilimi bu girdiyi bulmalı 2012-05-04 ararken Burada karşılıklı 2012-05-03 23:00 (UTC) gibi bir kullanıcı saklanır eğer.

Bu

anda böyle yapılır:

CONVERT_TZ(FROM_UNIXTIME(`javaTimeStampColumn`/1000),'+00:00','+00:00') 

ofc. ofsetler, kullanıcı saatine bağlı olarak ayarlanır.

Şu anda karşı karşıya olduğumuz sorun: Java, 2038 tarihinden sonraki tarihleri ​​unix zaman damgası olarak başarılı bir şekilde depolar. MySQL yöntemi from_unixtime ancak nedeniyle bu kadar tam sayı tipi sınırlama 2147483647 daha yüksek değerlerin herhangi bir dönüştürme desteklemez:

SELECT FROM_UNIXTIME(2147483647); //2038-01-19 04:14:07 

SELECT FROM_UNIXTIME(2147483648); //null 

MySQL sunucusu kendisi 64 bit, ancak ofc olup. FROM_UNIXTIME uzun argümanı kabul etmelidir.

Şu anda uygun bir yedek bulamıyorum, herhangi bir ipucu var mı?


Biz olabiliriz. zaman damgası bir Uzun olarak yükleyin ve uygulamada ele alın - Ancak lazylaoding için sorgulama sırasında doğru şekilde dönüştürebilmemiz gerekir.

+0

Veri türünü "datetime" olarak değiştirmemek için herhangi bir sebep var mı? –

+0

@juergend Evet, ne yazık ki veriler, bunu değiştiremeyeceğimiz bir uygulama tarafından oluşturulmaktadır. (3. taraf kitaplığı) – dognose

+0

Zaman damgası sütununun veri türünü "bigint" olarak değiştirmeyi denediniz mi? –

cevap

4

bir geçici çözüm DATE_ADD kullanmak olabilir, ama bunun nasıl davranacağını emin değilim epeyce:

SELECT DATE_ADD(FROM_UNIXTIME(0), INTERVAL 2147483647 SECOND); //2038-01-19 04:14:07 
SELECT DATE_ADD(FROM_UNIXTIME(0), INTERVAL 2147483648 SECOND); //2038-01-19 04:14:08 
... 
SELECT DATE_ADD(FROM_UNIXTIME(0), INTERVAL 4147483647 SECOND); //2101-06-06 07:47:27 
Yani şimdilik

, ben

... 
CASE 
    WHEN `javaTimeStampColumn` > 2147483647 THEN 
    CONVERT_TZ(DATE_ADD(FROM_UNIXTIME(0), INTERVAL `javaTimeStampColumn`/1000 SECOND),'+00:00','+00:00') 
    ELSE 
    CONVERT_TZ(FROM_UNIXTIME(`javaTimeStampColumn`/1000), '+00:00','+00:00') 
END as ts 
FROM table 
... 

kullanıyorum Varsa, performans üzerindeki etkiyi en aza indirmelidir.

+0

Sorun, bu (GMT + 1 saat dilimi) arasında tökezledi kadar: 'SELECT FROM_UNIXTIME (1469230446)' yapar: 2016-07-23 ** 01 **: 34:06 'SELECT DATE_ADD (FROM_UNIXTIME (0), INTERVAL 1469230446 SECOND) 'yapar: 2016-07-23 ** 00 **: 34:06 Herhangi bir fikrin var mı? –

+1

@ TamásMárton, "CONVERT_TZ" öğesini uygun ofsetlerle kullanın. Unix-Time her zaman UTC'dir. 'DATE_ADD' GMT + 1’inizin Saat Dilimini kullanıyor, dolayısıyla bunu düzeltmeniz gerekiyor. – dognose

+0

Teşekkürler, müşterinin saat dilimini '+00: 00' olarak ayarlamanız gerçekten düzeltildi. –