loading..
Русский    English
06:29
листать

Сортировка по дням рождения

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

Возьмём в качестве примера таблицу Battles, а именно, столбец date. Ясно, что сортировка просто по дате (date) не даст желаемого результата из-за года (так, например, 15-е ноября будет предшествовать 20-му октября):

Консоль
Выполнить
  1. SELECT date
  2. FROM Battles
  3. ORDER BY date;

date
1941-05-25 00:00:00.000
1942-11-15 00:00:00.000
1943-12-26 00:00:00.000
1944-10-25 00:00:00.000
1962-10-20 00:00:00.000
1962-10-25 00:00:00.000

Для выполнения требуемой сортировки можно предложить два варианта (SQL Server).

1. Использование функции CONVERT 

При этом способе мы преобразуем дату к текстовому представлению в формате "mm-dd"

Консоль
Выполнить
  1. SELECT CONVERT(CHAR(5), date, 110) "mm-dd"
  2. FROM Battles;
по которому и выполним сортировку:

Консоль
Выполнить
  1. SELECT date
  2. FROM Battles
  3. ORDER BY CONVERT(CHAR(5),date,110);

date
1941-05-25 00:00:00.000
1962-10-20 00:00:00.000
1962-10-25 00:00:00.000
1944-10-25 00:00:00.000
1942-11-15 00:00:00.000
1943-12-26 00:00:00.000


2. Использование функций MONTH и DAY

Здесь мы используем встроенные функции, которые возвращают компоненты даты - месяц (MONTH) и день (DAY) соответственно. По этим компонентам выполним сортировку:

Консоль
Выполнить
  1. SELECT date
  2. FROM Battles
  3. ORDER BY MONTH(date), DAY(date);

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

В заключение представим последний запрос в более наглядном виде, добавив в него еще и "виновника торжества":

Консоль
Выполнить
  1. SELECT DAY(date) BD_day, DATENAME(mm, date) BD_month, name
  2. FROM Battles
  3. ORDER BY MONTH(date), DAY(date);

Bookmark and Share
Тэги:
ALL AND AUTO_INCREMENT AVG battles CASE CAST CHAR CHARINDEX CHECK classes COALESCE Convert COUNT CROSS APPLY CTE DATEDIFF DATENAME DATEPART DATETIME DDL DEFAULT DELETE DISTINCT DML EXCEPT EXISTS EXTRACT FROM FULL JOIN GROUP BY Guadalcanal HAVING IDENTITY IN INNER JOIN insert INTERSECT IS NOT NULL ISNULL laptop LEFT LEFT OUTER JOIN LEN maker MAX MIN MONTH MySQL NOT Больше тэгов
Учебник обновлялся
месяц назад
©SQL-EX,2008 [Развитие] [Связь] [О проекте] [Ссылки] [Team]
Перепечатка материалов сайта возможна только с разрешения автора.
Rambler's Top100