2009-11-30 6 views
1

J'ai besoin de convertir une colonne de base de données dans une table de base de données (MSSQL) en UNIX time_t. Le problème est que cette colonne n'a pas de fuseau horaire et que certaines dates proviennent de GMT (+0000) et certaines de BST (+0100). Je travaille sur les temps britanniques.Existe-t-il un moyen fiable de convertir un datetime non-daté en UNIX time_t?

Y a-t-il un moyen fiable de convertir un datetime non-daté en UNIX time_t? J'utilise actuellement

SELECT *,DATEDIFF(second,'1970-01-01',event_time) 

Mais cela semble être soumis au fuseau horaire actuel , pas applicable à la date. Cela ne me dérange pas si je fais la conversion en SQL ou en code. Je travaille en Perl.

+0

Comment dites-vous actuellement quelles lignes sont GMT/UTC et BST? – Joe

+0

Ils ne le font pas. D'où ma question. –

+0

Comment cette colonne est-elle peuplée? – Powerlord

Répondre

3

Si vous voulez dire que les temps sont BST en été et GMT en hiver alors il est un fuseau horaire implicite dans la colonne, et ce n'est pas « deux fuseaux horaires différents », c'est un fuseau horaire, appelé Europe/London dans le Olson DB ou GMT0BST,M3.5.0/1,M10.5.0/2 au format POSIX TZ. Vous devriez facilement pouvoir convertir ces temps en utilisant le module DateTime ou même l'utilisation intelligente des fonctions POSIX, excepté l'heure ambiguë autour de la transition d'automne, qui ne peut pas être résolue à moins que vous gardiez une indication si BST était ou n'était pas en vigueur à l'époque.

Exemple d'utilisation DateTime:

use DateTime::Format::MSSQL; 
# In reality you would get this from the DB. 
my $input = "2009-11-30 16:13:18.123"; 
my $dt = DateTime::Format::MSSQL->parse_datetime($input); 
$dt->set_time_zone("Europe/London"); 
print "Unix time is ", $dt->epoch, "\n"; 
+0

Merci. C'est rassurant de savoir qu'il peut être résolu, mais pas une solution réelle. –

+0

Merci. Je vais l'essayer le matin. –

+0

Confirmé. Le monde est une fois de plus en sécurité! Merci beaucoup. –

0

Un horodatage UNIX est UTC sans heure d'été. Donc, si vous ne pouvez pas savoir si une date est GMT ou BST, vous ne pouvez pas la convertir en horodatage UNIX.

+1

Vous avez raison, je supposais que BST était un fuseau horaire. Apparemment, c'est juste l'heure d'été. La réponse de Hobbs devrait être tout ce dont vous avez besoin – Andomar

+0

Ah, comme d'habitude l'erreur est dans la question. Je ne voulais pas dire fuseau horaire, mais plutôt décalage horaire. Merci. –

1

Avec SQL 2008, est un nouveau type de date heure: datetimeoffset que -t info fuseau horaire retaint et peut ainsi être utilisé pour susbtract diff d'époque Unix. Mais cela nécessite une mise à niveau vers SQL 2008, la révision de votre schéma et le changement du type de colonne et la mise à jour rétroactive de toutes les données existantes pour définir le fuseau horaire approprié.

Si vous ne pouvez pas effectuer une mise à niveau vers SQL 2008, je vous recommande de stocker vos informations de date en UDT, ce qui implique de les convertir d'abord dans le client avant de les insérer dans la base de données. L'affichage des données à l'utilisateur dans l'heure locale appropriée devrait être, de nouveau, effectué dans le client.