Как отсортировать таблицу событий по времени (есть разные часовые пояса)? - PullRequest
0 голосов
/ 15 июля 2010

У меня есть таблица, которая структурирована следующим образом (которую я не могу изменить):

EventName, LocalTime, Timezone

Данные будут выглядеть примерно так:

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

как я могу написать sql для сортировки по фактическому времени, чтобы результат был следующим:

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

Обратите внимание, что Event2 и Event4 происходят одновременно, так что, что произойдет раньше, не имеет значения,

Моя база данных - MySQL.

Опять же, я не могу изменить источник, поэтому мне приходится работать с данными, с которыми я имел дело

Спасибо

1 Ответ

2 голосов
/ 15 июля 2010

Используя современную версию 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)

Ключ здесь в том, что Order By может принимать выражение.

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

Оптимизация

В приведенном выше примере MySql создаст временную таблицу.В зависимости от размера ваших данных может быть намного быстрее платить цену вставки данных по сравнению с ценой извлечения данных.

Для этого: добавьте еще один столбец в таблицу данных "time_gmt ", а затем сортировать по новому столбцу.Но если вы не можете, вышеописанное сработает.

Если вы не можете добавить таблицу Tz_offsets (если вы можете использовать только raw sql), тогда у вас есть два варианта:

  1. Добавляйте таблицу Tz_offsets в качестве временной таблицы при каждом запуске sql.Вашему пользователю MySQL понадобится разрешение на создание временной таблицы.

  2. Выполните поиск смещения tz в порядке по выражению с помощью выражения Case.

Например

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))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...