Как объединить дату и время из разных столбцов 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'
Если вы хотите учитывать секунды, вам нужно добавить две цифры в конец;)