2012-03-07 4 views
2

Так что у меня здоровый стола почасовой статистики, где день и время расщепляются, а не хранятся в особой DateTime:mysql: convert_tz игнорируется в тех случаях, где условия сравнения?

+-------+-------------+------------+----------+ 
| cakes | pies  | day  | hour  | 
+-------+-------------+------------+----------+ 
|  1 |   28 | 2012-02-21 |  20 | 
|  0 |   14 | 2012-02-21 |  21 | 
|  1 |   15 | 2012-02-21 |  22 | 
|  1 |   11 | 2012-02-21 |  23 | 
|  0 |   7 | 2012-02-22 |  0 | 
|  0 |   9 | 2012-02-22 |  1 | 
|  0 |   5 | 2012-02-22 |  2 | 
|  0 |   8 | 2012-02-22 |  3 | 
|  1 |   11 | 2012-02-22 |  4 | 
|  0 |   11 | 2012-02-22 |  5 | 
|  0 |   12 | 2012-02-22 |  6 | 
|  1 |   19 | 2012-02-22 |  7 | 
|  0 |   26 | 2012-02-22 |  8 | 
|  0 |   20 | 2012-02-22 |  9 | 
|  0 |   24 | 2012-02-22 |  10 | 
|  2 |   26 | 2012-02-22 |  11 | 
|  1 |   22 | 2012-02-22 |  12 | 
|  1 |   24 | 2012-02-22 |  13 | 
|  1 |   32 | 2012-02-22 |  14 | 
|  0 |   25 | 2012-02-22 |  15 | 
|  2 |   20 | 2012-02-22 |  16 | 
|  0 |   24 | 2012-02-22 |  17 | 
|  1 |   24 | 2012-02-22 |  18 | 
|  0 |   15 | 2012-02-22 |  19 | 
+-------+-------------+------------+----------+ 

Я хочу сделать часовой пояс чувствительным выбирает из этой таблицы, чтобы люди во всем мире может знайте о моих тортах пирога или пирога в любой час.

Вот что мой запрос будет без преобразования часового пояса:

select cakes, pies, day, hour, 
    str_to_date(concat(day,' ',hour,':00'), '%Y-%m-%d %H:%i:%s') 'this' from stats where 
    str_to_date(concat(day,' ',hour,':00'), '%Y-%m-%d %H:%i:%s') between 
    str_to_date('2012-02-21 20:00:00', '%Y-%m-%d %H:%i:%s') and 
    str_to_date('2012-02-21 23:00:00', '%Y-%m-%d %H:%i:%s');  

..which возвращает первые четыре строки указанного выше набора данных:

+-------+-------------+------------+----------+---------------------+ 
| cakes | pies  | day  | hour  | this    | 
+-------+-------------+------------+----------+---------------------+ 
|  1 |   28 | 2012-02-21 |  20 | 2012-02-21 20:00:00 | 
|  0 |   14 | 2012-02-21 |  21 | 2012-02-21 21:00:00 | 
|  1 |   15 | 2012-02-21 |  22 | 2012-02-21 22:00:00 | 
|  1 |   11 | 2012-02-21 |  23 | 2012-02-21 23:00:00 | 
+-------+-------------+------------+----------+---------------------+ 

До сих пор так хорошо. Теперь мне нужно сделать эту часовую чувствительность. Скажем, мой сервер в Калифорнии и кто-то из Новой Зеландии во время летних сбережений пытается получить доступ к моим пирогам и пирожным с 2012-02-21 20:00:00 по 2012-02-21 23:00:00:

select cakes, pies, day, hour, 
    str_to_date(convert_tz(concat(day,' ',hour,':00'), '+13:00','-8:00'), '%Y-%m-%d %H:%i:%s') 'this' from stats where 
    str_to_date(convert_tz(concat(day,' ',hour,':00'), '+13:00','-8:00'), '%Y-%m-%d %H:%i:%s') between 
    str_to_date(convert_tz('2012-02-21 20:00:00', '+13:00','-8:00') , '%Y-%m-%d %H:%i:%s') and 
    str_to_date(convert_tz('2012-02-21 23:00:00', '+13:00','-8:00') , '%Y-%m-%d %H:%i:%s'); 

но вот где он получает странно:

+-------+-------------+------------+----------+---------------------+ 
| cakes | pies  | day  | hour  | this    | 
+-------+-------------+------------+----------+---------------------+ 
|  1 |   28 | 2012-02-21 |  20 | 2012-02-20 23:00:00 | 
|  0 |   14 | 2012-02-21 |  21 | 2012-02-21 00:00:00 | 
|  1 |   15 | 2012-02-21 |  22 | 2012-02-21 01:00:00 | 
|  1 |   11 | 2012-02-21 |  23 | 2012-02-21 02:00:00 | 
+-------+-------------+------------+----------+---------------------+ 

это КАЖЕТСЯ думать, что это смотрит вверх часовой пояс скорректированных значений («это» колонок), но статистика возвращаемой точно такие же, как и из не-timezoned запрос! Что тут происходит?

ответ

2

Вы конвертируете все даты для сравнения (как даты ввода, так и даты из базы данных) с помощью convert_tz, поэтому никаких сюрпризов вы не получите обратно. Я думаю, что вы, вероятно, хотите,

SELECT cakes, pies, day, hour, 
    CONVERT_TZ(CONCAT(day,' ',hour,':00'), '+13:00','-8:00') AS 'this' 
FROM stats 
WHERE 
    CONVERT_TZ(CONCAT(day,' ',hour,':00'), '+13:00','-8:00') 
     BETWEEN 
      '2012-02-21 20:00:00' 
     AND '2012-02-21 23:00:00' 

Но почему вы храните дату и время отдельно? Это сделало бы ваши запросы намного проще хранить их вместе как поле DATETIME. Также вам не нужно использовать STR_TO_DATE для значений, которые уже являются значениями MySQL DATETIME.

+0

Похоже на это, спасибо за помощь. Часовые пояса - это боль в прикладе. У меня, к сожалению, нет контроля над архитектурой db, поэтому я не могу объединить эти поля. – Amalgovinus

Смежные вопросы