#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