loading..
Русский    English
03:42
листать

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

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

Возьмём в качестве примера таблицу 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 CONSTRAINT Convert COUNT CROSS APPLY CTE DATEADD DATEDIFF DATENAME DATEPART DATETIME DDL DEFAULT DELETE DISTINCT DML EXCEPT EXISTS EXTRACT FOREIGN KEY 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 Больше тэгов
Учебник обновлялся
вчера
©SQL-EX,2008 [Развитие] [Связь] [О проекте] [Ссылки] [Team]
Перепечатка материалов сайта возможна только с разрешения автора.
Rambler's Top100