Почему мои даты не сортируются правильно? - PullRequest
1 голос
/ 02 июня 2009

Интересно, сталкивался ли кто-нибудь с этой проблемой раньше?
У меня есть строка, преобразованная в дату и отсортированы по возрастанию. Дата сортируется численно, но не сортируется по месяцу. Интересно, кто-нибудь сталкивался с этой проблемой и может пролить свет на то, как правильно отсортировать дату.

SELECT
  u.url_id, 
  url, 
  title, 
  description, 
  pub_date, 
  DATE_FORMAT(STR_TO_DATE(pub_date, '%d-%b-%Y'), '%d.%b.%Y') AS pub_date,
  pub_date AS sortdate 
FROM 
  urls AS u, 
  url_associations AS ua 
WHERE
  u.url_id = ua.url_id 
  AND ua.url_category_id=$type
  AND ua.approved = 'Y'
ORDER BY
  sortdate DESC

Выше приведен код, и он работает, но дата не сортируется, например, сортируется так:

 29-may-2009
 28-may-2009
 27-may-2009
 02-june-2009
 01-june-2009

Ответы [ 6 ]

4 голосов
/ 02 июня 2009

Хорошо, я был немного смущен раньше. Ваш исходный запрос несколько сбивает с толку, так как вы выбираете pub_date в списке столбцов, а затем конвертацию также в pub_date. Тем не менее, вы затем сортировали по столбцу pub_date (фактически, с учетом sortdate as pub_date) - который выглядит как строковый столбец.

Ваш заказ должен быть в столбце после преобразования в дату, но до преобразования в строку:

SELECT
  u.url_id, 
  url, 
  title, 
  description, 
  pub_date,
  STR_TO_DATE(pub_date, '%d-%b-%Y') AS sortdate,
  DATE_FORMAT(STR_TO_DATE(pub_date, '%d-%b-%Y'), '%d.%b.%Y') AS formatted_date
FROM 
  urls AS u, 
  url_associations AS ua 
WHERE
  u.url_id = ua.url_id 
  AND ua.url_category_id=$type
  AND ua.approved = 'Y'
ORDER BY
  sortdate DESC

Обратите внимание, что я переименовал «отформатированную» версию в formatted_date. Не ясно, нужно ли вам еще выбирать оригинал pub_date или нет. Возможно, бит formatted_date может быть:

DATE_FORMAT(sortdate, '%d.%b.%Y') AS formatted_date

но я не совсем уверен. Я надеюсь, что оптимизатор запросов все равно это выяснит.

Ваш столбец pub_date действительно должен быть строкой? Почему бы не использовать его в качестве более подходящего типа в базе данных, чтобы избежать всего анализа?

4 голосов
/ 02 июня 2009

У меня были похожие проблемы. Что я сделал (и использовал только ORACLE), так это использовал date_format в вашем заказе вместо уже отформатированной даты.

так в вашем заказе по использованию:

DATE_FORMAT(STR_TO_DATE(pub_date, '%d-%b-%Y') DESC

или - который будет первым заказом к году

DATE_FORMAT(STR_TO_DATE(pub_date, '%Y-%b-%d') DESC
1 голос
/ 02 июня 2009

Вы указываете запросу сортировать по преобразованной строке, что означает, что он выполняет сортировку по строке , а не по дате . Попробуйте сделать заказ по pub_date.

1 голос
/ 02 июня 2009

Похоже, "pub_date" - это строковое поле? Если это так, вам нужно будет преобразовать его в datetime, чтобы сортировка работала как положено.

0 голосов
/ 02 июня 2009

Вы хотите отсортировать, как это ..

ORDER BY DATE_FORMAT(STR_TO_DATE(pub_date, '%d-%b-%Y'), '%d.%b.%Y')

Но, если позволите, вам следует подумать об изменении базового столбца со строки на дату - множество причин: масштабируемость, производительность, удобство обслуживания, целостность данных, yada yada yada.

0 голосов
/ 02 июня 2009

Попробуйте

"SELECT u.url_id, url, title, description, pub_date, DATE_FORMAT(STR_TO_DATE(pub_date, '%d-%b-%Y'), '%d.%b.%Y') AS pub_date, pub_date AS sortdate FROM urls AS u, url_associations AS ua WHERE u.url_id = ua.url_id AND ua.url_category_id=$type AND ua.approved = 'Y' ORDER BY pub_date DESC";

Проблема в том, что у вас есть

 pub_date AS sort_date 

внутри запроса, и поэтому, когда вы сортируете по sort_date, вы сортируете по строке. Заменить порядок сортировки на

ORDER BY pub_date DESC

и все должно работать.

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