что этот дефис делает между столбцами в предложении order by в запросе mysql?

#mysql #sql #datetime #sql-order-by

#mysql #sql #дата и время #sql-order-by

Вопрос:

что этот дефис делает между столбцами updated_at и created_at в предложении order by ?

 select * from `users` order by updated_at - created_at DESC 
  

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

1. — минус в mysql

Ответ №1:

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

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

Ответ №2:

Похоже, что цель order by предложения — отсортировать по разнице между двумя датами. Сначала сортируются строки, в которых разница наибольшая.

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

Вместо этого вы должны использовать функции даты, например:

 order by unix_timestamp(updated_at) - unix_timestamp(created_at) desc 
  

Или:

 order by timestampdiff(second, created_at, updated_at) desc