упорядочение по сгруппированным датам в базе данных - PullRequest
0 голосов
/ 30 сентября 2011

Привет, есть проблема, похожая на этот вопрос

Хитрое «групповое» упорядочение в SQL

но, похоже, не работает с датами

мой стол вроде

Car_ID   Car_Brand   Car_Model   Car_launch_date
   1     Ford        Fiesta      12-12-2011
   2     Ford        Mustang     09-04-2008
   3     Ford        Focus       10-02-2012
   4     Honda       Civic       11-05-2012
   6     Honda       Jazz        02-05-2011
   7     Toyota      Prius       11-10-2011

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

Я хочу, чтобы мой вывод был таким:

Car_ID   Car_Brand   Car_Model   Car_launch_date
   7     Toyota      Prius       11-10-2011
   1     Ford        Fiesta      12-12-2011
   3     Ford        Focus       10-02-2012
   2     Ford        Mustang     09-04-2008
   4     Honda       Civic       11-05-2012
   6     Honda       Jazz        02-05-2011

Ответы [ 2 ]

1 голос
/ 30 сентября 2011

Ваши даты в базе данных DATE объекты или строки? Потому что если вы попытаетесь заказать их как строки, это не сработает!

Если даты DATE с, попробуйте:

SELECT * from my_table
ORDER BY Car_Brand DESC, 
         Car_launch_date < NOW(), 
         ABS(DATEDIFF(Car_launch_date, NOW()))

Если это строки, попробуйте:

SELECT * from my_table
ORDER BY Car_Brand DESC, 
         DATE(Car_launch_date) < NOW(), 
         ABS(DATEDIFF(DATE(Car_launch_date), NOW()))

Когда вы указываете более одного столбца в порядке, он упорядочивается по первому столбцу, а затем по следующему, если значения в первом столбце совпадают.

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

Примечание: я поставил Car_Brand DESC (обратный альфа-порядок), потому что так было у вас выше.

Спасибо ОП за то, что вы обнаружили более сложный заказ. Но я бы сказал, что так лучше :)

0 голосов
/ 30 сентября 2011

Используя предыдущий пост в качестве дополнения, лучший ответ будет:

GROUP BY Car_Brand 
ORDER BY 
CASE WHEN Car_launch_date >= NOW() THEN 0 ELSE 1 END, 
CASE WHEN Car_launch_date >= NOW() THEN DATEDIFF(Car_launch_date, NOW()) ELSE DATEDIFF(NOW(), Car_launch_date) END

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...