получите самую высокую дату между двумя столбцами дат в запросе mysql

#mysql

Вопрос:

Здравствуйте, у меня есть два столбца даты и времени из нескольких строк, я хочу получить строку с последней датой(самой высокой) между двумя столбцами всех записей. Пожалуйста, проверьте ниже:

  ID|Date1                 |Date2
 1 |2021-06-10 19:03:36   |Null
 2 |2021-06-11 19:33:41   |2021-06-16 09:49:41
 3 |2021-06-16 20:04:24   |Null
 

Я хочу получить самую высокую дату из всех записей двух столбцов(Дата 1 и Дата 2). Из приведенной выше таблицы мне нужна дата третьей строки, потому что это самая высокая дата(2021-06-16 20:04:24) из всех записей двух столбцов. Если мы изменим строку 3 столбца date1 к 2021-06-16 09:20:41, результатом будет строка 2, потому что самая высокая запись даты найдена в date2. Пожалуйста, помогите мне создать запрос mysql для получения полной строки данных

Ответ №1:

Если вам нужна только 1 строка в результатах и вас не волнуют связи, используйте GREATEST() для получения максимальной даты в каждой строке, отсортируйте по этой максимальной дате по убыванию и LIMIT 1 выберите верхнюю строку:

 SELECT *
FROM tablename
ORDER BY GREATEST(COALESCE(Date1, '1000-01-01'), COALESCE(Date2, '1000-01-01')) DESC 
LIMIT 1
 

Если Date1 не может быть аннулировано, используйте COALESCE() только для Date2 :

 SELECT *
FROM tablename
ORDER BY GREATEST(Date1, COALESCE(Date2, '1000-01-01')) DESC 
LIMIT 1
 

Смотрите демонстрацию.

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

1. спасибо за предоставление полезной функции

2. @RajasthanAyurvedUniversity отлично, если это сработало, и не забудьте принять ответ, нажав на галочку.

Ответ №2:

Вы можете объединить два столбца и получить MAX() :

 SELECT MAX(dateColumns)
FROM
    (
     SELECT DATE1 as dateColumns FROM yourtable
     UNION ALL
     SELECT DATE2 FROM yourtable
    ) sub
 

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

1. Сглазьте, если оба придумают «свой стол» независимо друг от друга. К вашему сведению: Исходный вопрос немного противоречив в том, нужно ли возвращать всю строку или только максимальную дату.

2. Это слишком смешно. Я видел, как пришел твой ответ, и даже не заметил этого. Я согласен с этой двусмысленностью. Я полагаю, что они смогут разобраться в этом, как только получат какое-то представление о том, как идентифицировать макса.

3. @JNevill Я хочу полную запись,такую как идентификатор,дата 1, дата 2

Ответ №3:

Один из способов сделать это с помощью несколько минимального SQL, где «yourtable» — это независимо от имени вашей таблицы:

 select ID, Date1, Date2
from yourtable
where greatest(
  coalesce(Date1,'1900-01-01'), 
  coalesce(Date2,'1900-01-01')
) in (
  select max(greatest(
    coalesce(Date1,'1900-01-01'), 
    coalesce(Date2,'1900-01-01')
  )) from yourtable
)
 

Однако производительность такого рода запросов может не масштабироваться для огромных таблиц. ИЗМЕНИТЬ: Обновлено, чтобы включить объединение() нулевых дат в произвольно «раннюю» дату.

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

1. Я бы добавил coalesce, иначе greatest даст null для тех записей, где дата 1 или дата 2 равна нулю

2. Спасибо, что указали на это. Я обновлю ответ. Есть ли лучшая ценность для объединения, чем произвольно «старая» дата?

3. Я бы использовал greatest(объединение(дата 1, дата 2), объединение(дата 2, дата 1)). это должно быть общим.