Как объединить дату и время из разных столбцов MySQL, чтобы сравнить с полным DateTime? - PullRequest
9 голосов
/ 08 февраля 2012

Столбец 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 ]

20 голосов
/ 08 февраля 2012

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

SELECT * FROM `mytable` WHERE CONCAT(`d`,' ',`t`) > '2012-02-01 15:00'
11 голосов
/ 12 декабря 2013

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

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

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

SELECT * FROM `mytable` WHERE TIMESTAMP(`d`, `t`) > '2012-02-01 15:00'
3 голосов
/ 02 декабря 2013

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

 DATE_ADD(date, INTERVAL time HOUR_SECOND)
1 голос
/ 08 февраля 2012

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

Предположим, что вы хотите выбрать строки, где отметка времени> 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
0 голосов
/ 09 июня 2015

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

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

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

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