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

В настоящее время я использую это, где он не выбирает все сегодняшние экземпляры:

SELECT * FROM `tasks` WHERE `due_date` >= NOW() AND `due_time` >= NOW()

У меня нет доступа к чередованию базы данных для поля DATETIME. Я могу только выбирать.

due_date имеет тип DATE , а due_time имеет TIME как тип

0
jQuerybeast 22 Апр 2016 в 18:13

3 ответа

Лучший ответ

Чтобы получить поведение, которое кажется вам искомым, вы можете сделать что-то вроде этого:

  SELECT t.* FROM `tasks` t
   WHERE t.`due_date` >= DATE(NOW())
     AND (  ( t.`due_date` = DATE(NOW()) AND t.`due_time` >= TIME(NOW()) )
         OR ( t.`due_date` > DATE(NOW()) )
         )

Первый разрез - это сравнение с due_date, всеми задачами, которые должны быть выполнены сегодня или позже. Сюда входит слишком много задач, нам нужно избавиться от задач, которые должны быть выполнены сегодня, но раньше текущего времени.

Есть и другие подходы к запросам, которые могут показаться «более простыми». Приведенный выше подход сохраняет предикаты в пустых столбцах, поэтому MySQL может эффективно использовать операции сканирования диапазона для подходящих индексов.

ПОДПИСАТЬСЯ

Я делал этот тип запроса раньше для разбиения на страницы с несколькими столбцами в ключе. Что-то меня беспокоило в том исходном запросе, в нем было больше условий, чем действительно требовалось. (Что меня сбило с толку, так это условие> = на due_time.)

Я считаю, что это эквивалентно:

  SELECT t.* FROM `tasks` t
   WHERE t.`due_date` >= DATE(NOW())
     AND ( t.`due_date` > DATE(NOW()) OR t.`due_time` >= TIME(NOW()) )
1
spencer7593 22 Апр 2016 в 15:51
SELECT * FROM `tasks` WHERE `due_date` >= DATE(NOW()) AND `due_time` >= TIME(NOW());

DATE () извлекает часть года-месяца-даты, а TIME () - часть часов: минут: секунд.

http://dev.mysql.com/doc/refman/5.7/en/date-and-time-functions.html

1
Jared Beekman 22 Апр 2016 в 15:19

Попробуйте вместо этого использовать CURDATE() и CURTIME(). Вы должны быть в состоянии выработать логику, имея их в своем распоряжении.

Подробнее здесь: http://www.w3schools.com/sql/func_now.asp

Хотя, согласно комментариям, обычно идеально хранить версию даты и времени того, что вы хотите сравнить с datetime. Затем вы можете просто провести одно сравнение и использовать NOW(), как сейчас.

0
Dave 22 Апр 2016 в 15:20