ВЫБЕРИТЕ дату, которая больше текущей даты

У меня есть таблица базы данных MySQL, в которой одна ячейка содержит несколько дат, и я хочу выбрать все строки, содержащие ячейку, где одна или несколько дат больше, чем сегодняшняя дата, возможно ли это? (используя PHP)

Конечно:

select * from MyTable where MyDate > Now() 

Как ваше одно поле содержит несколько дат? Возможно, вам стоит рассмотреть отдельную таблицу для этого.

«Одна ячейка содержит несколько дат» .. суть проблемы. Вот три варианта.

Нормализовать / исправить схему

Начните с адекватно нормированной схемы – в частности, любой столбец / «ячейка» может иметь не более одной даты (или фрагмента информации). Это может потребовать или не потребовать введения другой таблицы в зависимости от роли информации.

Этот подход является масштабируемым и работает в рамках проекта RDMBS / RA, и, если это будет сделано, другие представленные запросы будут «просто работать».

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

Создание нормализованного представления

Создайте нормализованное представление денормализованной таблицы (или такой запросифицирующий запрос), который может быть JOIN ed. Затем используйте один из предложенных вариантов (которые работают на нормализованной схеме), хотя и в крайне невыгодном положении, поскольку не могут использовать индексы.

Это ужасно грязно, но это можно сделать. См. SELECT де-нормированные столбцы в отдельные записи? для примера. (Обратите внимание на соотношение синтезированных строк здесь, хотя некоторые базы данных [не MySQL] также поддерживают табличные функции и кросс-приложения таких.)

Этот подход не масштабируется, потому что он не может использовать индексы.

Фильтр в клиенте (PHP)

Выбираем каждую строку. Петля и использование explode и т. Д., Если это необходимо.

Этот подход не масштабируется из-за отсутствия индексов и требует, чтобы все данные извлекались локально.


Хотя поиск равных значений в денормализованных столбцах может быть осуществлен с помощью различных хаков (например, FIND_IN_SET ), поиск относительных (т.е. больших / меньших) значений невозможен с использованием тех же методов. Решение, которое работает в обоих случаях, – это исправление базовой схемы.

Если поле DATE или DATETIME вы можете использовать

 SELECT * FROM table WHERE datefield > NOW() 

Если вы только после DATE а не DATETIME вы можете использовать CURDATE() вместо NOW()