0

Проблема с ORDER BY date в SQL

14

Заголовок: Проблема с сортировкой дат в 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 ответ(ов)

0

Похоже, что ваша колонка не является колонкой даты, а текстовой (например, varchar/nvarchar и т.д.). Вам следует хранить ее в базе данных в формате даты, а не строки.

Если по каким-то причинам вам все же нужно хранить дату как строку, используйте сортируемый формат, например, yyyy/MM/dd.

Как показывает najmeddine, вы можете конвертировать колонку при каждом обращении к ней, но я бы старательно избегал этого. Это заставит базу данных выполнять гораздо больше работы — она не сможет поддерживать соответствующие индексы и т.д. Всегда старайтесь хранить данные в типе, соответствующем самим данным.

0

Не уверен, какой СУБД вы используете, но вот как я бы это сделал в Microsoft SQL:

SELECT [date]
FROM tbemp 
ORDER BY CAST([date] AS DATETIME) ASC

Если у вас другая СУБД, дайте знать, и я постараюсь помочь с адаптацией запроса!

0

Это работает для меня:

SELECT datefield
FROM myTable
ORDER BY CONVERT(DATE, datefield) ASC

Этот запрос позволяет упорядочить записи в таблице myTable по полю datefield в восходящем порядке, предварительно приводя его к типу данных DATE. Убедитесь, что формат данных в datefield корректен для успешного преобразования.

0

Следующий ответ может помочь вам выполнить сортировку дат по вашему идентификатору даты. Используйте функцию 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() для форматирования даты в виде строки в нужном формате, что упрощает её отображение. Вы также можете управлять агрегированными данными о количестве заявок и подтверждений.

0

Для выполнения вашей задачи вы можете использовать следующий SQL-запрос:

SELECT CONVERT(char(19), CAST(date AS datetime), 101) AS [date]
FROM tbemp 
ORDER BY CONVERT(datetime, date, 101) ASC

Этот запрос выполняет следующие действия:

  1. CAST(date AS datetime): Преобразует столбец date в тип данных datetime, что позволяет работать с датами в нужном формате.
  2. CONVERT(char(19), ..., 101): Преобразует полученное значение datetime в строковый формат длиной 19 символов, используя стиль 101 (mm/dd/yyyy).
  3. Результат выбирается из таблицы tbemp.
  4. ORDER BY CONVERT(datetime, date, 101) ASC: Сортирует результаты по дате в восходящем порядке, используя тот же стиль преобразования.

Не забудьте уточнить, что тип данных в столбце date изначально должен быть совместим с преобразованием в datetime. Если возникнут проблемы, убедитесь, что в столбце нет некорректных значений.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь