2010-07-15 6 views
0

J'ai une table qui est structuré de la façon suivante (que je ne peux pas changer):Comment trier une table d'événements par heure (avoir des fuseaux horaires différents)?

EventName, LocalTime, Fuseau horaire

données serait quelque chose comme ceci:

Event1, 10:00, ET 
Event2, 11:00, ET 
Event3, 12:00, ET 
Event4, 10:00, CT 

comment peut j'écris un sql pour trier cela en temps réel de sorte que résultat serait comme:

Event1, 10:00, ET 
Event2, 11:00, ET 
Event4, 10:00, CT 
Event3, 12:00, ET 

Notez que event2 et event4 se produisent au même ti moi donc peu importe ce qui vient en premier n'a pas d'importance.

Ma base de données est le MySQL.

Encore une fois, je ne peux pas modifier la source, donc je dois travailler avec les données que je suis traité avec

Merci

Répondre

2

L'utilisation d'un ver moderne de mysql ...

Create table Tz_offsets: 
col Timezone, offset 
Data: 
ET, 0 
CT, 1 


Select EventName, LocalTime, Timezone 
From my_data_table 
JOIN Tz_offsets On Tz_offsets.Timeszone = my_data_table.Timeszone 
Where xxx 
Order By (LocalTime - offset) 

La clé ici est que Order By peut prendre une expression.

Voir http://dev.mysql.com/doc/refman/5.5/en/select.html

Optimisation

Dans l'exemple ci-dessus, MySql va créer une table temporaire. Selon la taille de vos données, il peut être plus rapide de payer un prix d'insertion de données par rapport à un prix de récupération de données. Pour cela: ajoutez une autre colonne à la table de données, "time_gmt", puis effectuez un tri sur la nouvelle colonne. Mais si vous ne pouvez pas, ce qui précède fonctionnera.

Si vous ne pouvez pas ajouter la table Tz_offsets (si vous ne pouvez utiliser sql brut), alors vous avez deux choix:

  1. Ajoutez la table Tz_offsets comme une table temporaire à chaque fois que vous exécutez votre sql . Votre utilisateur MySQL aura besoin d'une autorisation de création de table temporaire. Effectuez les recherches de décalage tz dans l'ordre par l'expression à l'aide de l'expression Case.

Par exemple,

Select EventName, LocalTime, Timezone 
From my_data_table 
Where xxx 
Order By (LocalTime - 
    (CASE Timezone WHEN 'ET' THEN 0 WHEN 'CT' THEN 1 WHEN 'PT' THEN 3 ELSE 0)) 
+0

Impressionnant, merci !!!!!! Ça fonctionne maintenant :) – Charlie

Questions connexes