Как выбрать все записи, превышающие дату в таблице mysql?

#mysql #sql

#mysql #sql

Вопрос:

Моя таблица: ( validfrom и validto и 03JUL2014 ниже все имеют тип DATE , не STRING )

 id   type    validfrom    validto 
-------------------------------------
1   "APPLE"   10MAY2011    15APR2012
1   "APPLE"   19APR2012    15APR2017
1   "ORANGE"   10MAY2011    15APR2012
1   "ORANGE"   19APR2012    15AUG2018
1   "PEAR"   10MAY2012    15APR2013
1   "PEAR"   10MAY2011    15APR2018
2   "APPLE"   10MAY2011    15APR2017
2   "APPLE"   10MAY2011    15APR2012
2   "ORANGE"   10MAY2011    15APR2012
2   "ORANGE"   10MAY2011    15APR2015
2   "ORANGE"   10MAY2007    15APR2019
2   "PEAR"   10MAY2003    15APR2012
2   "PEAR"   10MAY2006    15APR2022
  

Я хочу получить все записи, где id есть 2 и validto больше 03JUL2014 .

Таким образом, я должен получить:

 2   "APPLE"   10MAY2011    15APR2017
2   "ORANGE"   10MAY2007    15APR2019
2   "PEAR"   10MAY2006    15APR2022
  

Я пытался:

 SELECT type, validfrom, MAX(validto) FROM crew_qualifications 
               WHERE id=2 AND validto >= 03JUL2014
  

Это только дало мне:

 2   "PEAR"   10MAY2006    15APR2022
  

Комментарии:

1. Что такое тип данных valid_from и valid_to ?

2. почему вы не сохраняете дату в обычном формате datetime

3. valid_from и valid_to — это даты.

4. alwbtc: форматирование ваших столбцов даты вызывает путаницу среди респондентов. Я бы посоветовал вам удалить оператор MAX () вокруг valid_to, как указано в Appasaheb, ниже, как предложено (предполагая, что validto, показанный здесь, также является опечаткой).

Ответ №1:

В вашем запросе вы пишете MAX(validto), тогда он возвращает только те строки, значение validto которых равно max

вы удаляете MAX (validto), затем он возвращает правильный ответ

Комментарии:

1. Но я хочу получить запись, чей validto больше 03 ИЮЛЯ 2014, и среди них я хочу получить запись с максимальной validto датой

Ответ №2:

Сначала найдите максимальную дату для каждого типа в заданном временном диапазоне. Затем снова объединитесь с вашей таблицей, чтобы получить полную запись.

 select cq.type, cq.validfrom, cq.validto
from crew_qualifications cq
join
(
  select type, max(validto) as validto
  from crew_qualifications 
  where validto >= '2014-07-03'
  group by type
) wanted_cq
on wanted_cq.type = cq.type and wanted_cq.validto = cq.validto;
  

Что касается вашего запроса: вы выбираете MAX (validto) без групп, поэтому вы получаете MAX (validto) для всей таблицы, то есть для одной записи. Вместе с максимальным значением (validto) вы получаете случайный тип и случайное значение validfrom из вашей таблицы, поскольку вы не указываете, какой тип и значение validfrom вы хотите видеть (минимальное, максимальное или среднее). (Кроме того, validto >= 03JUL2014 должно выдать синтаксическую ошибку. Я удивлен, что это, очевидно, не так. Я не знаю, как MySQL интерпретирует это здесь.)