MySQL Выбрать строки <= now (), используя разделенные поля времени - PullRequest
1 голос
/ 18 января 2012

У меня есть таблица 't' с полями даты (гггг-мм-дд), часов (1-12), минут (00-59), ампер (a / p) и часового пояса (pst / est).

Как я могу выбрать строки, которые являются <= now ()? (т.е. уже произошло) </p>

Спасибо за ваши предложения!

edit: это делает это без внимания к полям часа / минуты / ap / tz:

SELECT * FROM t.date WHERE date <= now()

Ответы [ 2 ]

0 голосов
/ 18 января 2012
SELECT * FROM t
WHERE `date`<=DATE_SUB(curdate(), INTERVAL 1 DAY)
OR (
  `date`<=DATE_ADD(curdate(), INTERVAL 1 DAY)
   AND
   CONVERT_TZ(CAST(CONCAT(`date`,' ',IF(`hour`=12 AND ampm='a',0,if(ampm='a',`hour`,`hour`+12)),':',`minute`,':00') AS DATETIME),'GMT',`timezone`)<=NOW()
)

Обоснование для date <= DATE_ [ADD | SUB] (curdate (), INTERVAL 1 DAY): </p>

Необычное преобразование - довольно дорогая операция, поэтому мы не хотим, чтобы оно выполнялось на полной таблице. Вот почему мы предварительно выбираем поле UNCHANGED date (возможно, используя индекс). Ни в одном часовом поясе событие в прошлом текущем часовом поясе не может быть более чем одним днем, и ни в одном часовом поясе событие в текущем часовом поясе не может быть в прошлом.

0 голосов
/ 18 января 2012

Вот один из способов сделать это - объединить все свои секунды, минуты и т. Д. В дату и сравнить с NOW(), убедившись, что вы выполняете сравнение в одном часовом поясе.(Не проверено):

SELECT *
FROM t
LEFT JOIN y ON t.constant=y.constant
WHERE CONVERT_TZ(STR_TO_DATE(CONCAT(date,' ',hour,':',minute,' 'ampm),
                             '%Y-%m-%d %l:%i %p' ),
                 timezone,"SYSTEM") < NOW();

Если ваш час 01 - 12, а не 1-12, тогда используйте %h вместо %l в STR_TO_DATE.

STR_TO_DATEпытается соединить ваши столбцы даты и времени и преобразовать их в дату.

CONVERT_TZ(...,timezone,"SYSTEM") преобразует эту дату из любого часового пояса, указанного в столбце timezone, в системное время.

Затем это сравнивается с NOW(), который всегда находится в системном времени.

В качестве отступления, возможно, вам следует создать один столбец date, используя тип данных MySQL, поскольку арифметику намного прощеthat!

Для справки, здесь - это сводка очень полезных функций даты mysql, где вы можете прочитать о функциях, представленных в этом ответе.

Удачи!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...