Проблема с ORDER BY date в SQL
Заголовок: Проблема с сортировкой дат в SQL-запросе
Здравствуйте!
Мне нужна помощь с решением проблемы. Я пытаюсь отсортировать результаты SQL-запроса по дате, но не получаю ожидаемых результатов.
Вот SQL-запрос, который я использую:
SELECT date FROM tbemp ORDER BY date ASC
Результаты запроса выглядят так:
01/02/2009
03/01/2009
04/06/2009
05/03/2009
06/12/2008
07/02/2009
Однако правильный порядок результатов должен быть следующим:
06/12/2008
03/01/2009
01/02/2009
07/02/2009
Проблема, скорее всего, связана с форматом даты, который я использую. Я хочу получить даты в указанном формате.
Буду благодарен за помощь!
5 ответ(ов)
Похоже, что ваша колонка не является колонкой даты, а текстовой (например, varchar/nvarchar и т.д.). Вам следует хранить ее в базе данных в формате даты, а не строки.
Если по каким-то причинам вам все же нужно хранить дату как строку, используйте сортируемый формат, например, yyyy/MM/dd.
Как показывает najmeddine, вы можете конвертировать колонку при каждом обращении к ней, но я бы старательно избегал этого. Это заставит базу данных выполнять гораздо больше работы — она не сможет поддерживать соответствующие индексы и т.д. Всегда старайтесь хранить данные в типе, соответствующем самим данным.
Не уверен, какой СУБД вы используете, но вот как я бы это сделал в Microsoft SQL:
SELECT [date]
FROM tbemp
ORDER BY CAST([date] AS DATETIME) ASC
Если у вас другая СУБД, дайте знать, и я постараюсь помочь с адаптацией запроса!
Это работает для меня:
SELECT datefield
FROM myTable
ORDER BY CONVERT(DATE, datefield) ASC
Этот запрос позволяет упорядочить записи в таблице myTable
по полю datefield
в восходящем порядке, предварительно приводя его к типу данных DATE
. Убедитесь, что формат данных в datefield
корректен для успешного преобразования.
Следующий ответ может помочь вам выполнить сортировку дат по вашему идентификатору даты. Используйте функцию TO_CHAR()
в списке SELECT и применяйте другой идентификатор для даты.
Например:
SELECT TO_CHAR(DISPDATE1,'DD/MM/YYYY') AS DISPDATE,
SUM(APPLCOUNT) AS APPLIED,
SUM(CONFCOUNT) AS CONFIRMED
FROM
(
SELECT COUNT(ID) AS APPLCOUNT,
0 AS CONFCOUNT,
STUDENT.APPLIED_ON AS DISPDATE1
FROM STUDENT
WHERE STUDENT.ID = P_ID
GROUP BY STUDENT.APPLIED_ON
UNION
SELECT 0 AS APPLCOUNT,
COUNT(ID) AS CONFCOUNT,
STUDENT.CONFIRMED_ON AS DISPDATE1
FROM STUDENT
WHERE STUDENT.ID = P_ID
GROUP BY STUDENT.CONFIRMED_ON
)
GROUP BY DISPDATE1
ORDER BY DISPDATE1;
В этом запросе используется TO_CHAR()
для форматирования даты в виде строки в нужном формате, что упрощает её отображение. Вы также можете управлять агрегированными данными о количестве заявок и подтверждений.
Для выполнения вашей задачи вы можете использовать следующий SQL-запрос:
SELECT CONVERT(char(19), CAST(date AS datetime), 101) AS [date]
FROM tbemp
ORDER BY CONVERT(datetime, date, 101) ASC
Этот запрос выполняет следующие действия:
CAST(date AS datetime)
: Преобразует столбецdate
в тип данныхdatetime
, что позволяет работать с датами в нужном формате.CONVERT(char(19), ..., 101)
: Преобразует полученное значениеdatetime
в строковый формат длиной 19 символов, используя стиль101
(mm/dd/yyyy).- Результат выбирается из таблицы
tbemp
. ORDER BY CONVERT(datetime, date, 101) ASC
: Сортирует результаты по дате в восходящем порядке, используя тот же стиль преобразования.
Не забудьте уточнить, что тип данных в столбце date
изначально должен быть совместим с преобразованием в datetime
. Если возникнут проблемы, убедитесь, что в столбце нет некорректных значений.
Как вернуть только дату из типа данных DateTime в SQL Server
Множественная сортировка по нескольким столбцам в SQL
MySQL Запрос: Группировка по Дню / Месяцу / Году
Лучший способ удалить часть времени из datetime в SQL Server
Обновление данных в одной таблице из другой на основе совпадения ID