Как объединить дату и время из разных столбцов MySQL для сравнения с полным DateTime?

колонки d - дата, столбец t время, колонки v, например, INT. Допустим, мне нужны все значения, записанные после 15: 00 01 февраля 2012 года и далее. Если я напишу

SELECT * FROM `mytable` WHERE `d` > '2012-02-01' AND `t` > '15:00'

все записи, сделанные до 15: 00 в любую дату, будут исключены из результирующего набора (а также все сделанные в 2012-02-01), пока я хочу их видеть. Кажется, было бы легко, если бы был один столбец DATETIME, но вместо этого есть отдельные столбцы для даты и времени мое дело.

лучшее, что я вижу сейчас, это что-то вроде

SELECT * FROM `mytable` WHERE `d` >= '2012-02-02' OR (`d` = '2012-02-01' AND `t` > '15:00')

идеи получше? Может быть, для этого есть функция в MySQL? Разве нет чего-то вроде

SELECT * FROM `mytable` WHERE DateTime(`d`, `t`) > '2012-02-01 15:00'

возможно?

5 ответов


вы можете использовать mysql CONCAT() функция для добавления двух столбцов вместе в один, а затем сравните их следующим образом:

SELECT * FROM `mytable` WHERE CONCAT(`d`,' ',`t`) > '2012-02-01 15:00'

на TIMESTAMP(expr1,expr2) функция явно для объединения значений даты и времени:

С одним аргументом эта функция возвращает дату или время выражение expr Как значение datetime. С двумя аргументами, он добавляет времени expr2 к выражению даты или времениexpr1 и возвращает результат в виде значения datetime.

это результирующее использование именно то, что вы предсказали:

SELECT * FROM `mytable` WHERE TIMESTAMP(`d`, `t`) > '2012-02-01 15:00'

вот чистая версия, которая не требует строковых операций или преобразования в метки времени UTC в разных часовых поясах.

 DATE_ADD(date, INTERVAL time HOUR_SECOND)

все, что вам нужно сделать, это преобразовать его в метку времени Unix и сделать соответствующий выбор. Для этого вы должны использовать функции mysql, такие как *unix_timestamp().* и *date_format*

Предположим, вы хотите выбрать строки, где timestamp > 1328725800, следующая инструкция sql выполнит задачу.

select unix_timestamp(d)+3600*date_format(t,'%h)+60*date_format(t,'%i')+date_format(t,'%S') as timestamp from table where timestamp>1328725800

на самом деле должно быть:

SELECT * FROM `mytable` WHERE CONCAT(`d`,' ',`t`) > '2012-02-01 15:00:00'

Если вы хотите учитывать секунды, вам нужно добавить две цифры в конец;)