2009-06-02 2 views
1

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

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 
+0

"pub_date" строковое поле в таблице? –

ответ

4

Хорошо, я был немного смущен раньше. Ваш исходный запрос несколько запутан, так как вы выбираете 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 должен быть строкой? Почему бы не сохранить его в качестве более подходящего типа в базе данных для начала, чтобы избежать всего синтаксического анализа?

+0

Спасибо, это сработало, мне пришлось немного изменить его, отбросив AS Formatted_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 ') 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 "; – Ddywalgi

+0

Благодарим вас, что дата - это сборщик календаря javascript, который передает скрытую строку в базу данных. Теперь я пытаюсь преобразовать дату в формат, который будет проверять RSS. Большое вам спасибо за вашу помощь. Я довольно новичок в этом, и даты меня прядут. Еще раз спасибо Jon и всем, кто выложил, вы все очень помогли. – Ddywalgi

+0

Тогда каково значение DATE_FORMAT как (в терминах имени столбца)? Мой SQL-fu довольно слаб, но я не могу понять, почему он не с именем ... –

-1

Попробуйте

"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 

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

ORDER BY pub_date DESC 

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

+0

Привет, Натаниэль, я использую этот текущий синтаксис, но он не будет сортировать дату месяца по убыванию. // «SELECT u.url_id, url, title, description, pub_date, DATE_FORMAT (STR_TO_DATE (pub_date, '% d-% b-% Y'), '% Y.% m.% D') FROM urls AS u , url_associations AS ua WHERE u.url_id = ua.url_id И ua.url_category_id = $ type AND ua.approved = 'Y' ORDER BY pub_date DESC "; // Благодарим за помощь – Ddywalgi

+0

Проблема в том, что вы сейчас выбираете просто pub_date, который является строкой. Если вы используете этот запрос, вы должны ЗАКАЗАТЬ по u DESC. –

4

У меня были подобные проблемы. То, что я сделал (и только с использованием 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 
+0

Это все еще будет сортировка по * строке *, а не по дате *, правда? –

+0

К сожалению, у меня есть только доступ к ORACLE сегодня, поэтому я не могу проверить, однако, в ORACLE, который я только что протестировал, и он корректно работает с to_char (created_dt, 'dd/MON/yyyy'), который также возвращает строку. Ограничение - это дни, затем месяцы. Вы могли бы продолжить его дальнейшее продвижение с дополнительной строкой date_format в заказе, чтобы упорядочить месяцы – northpole

+0

, или вы даже можете перенести свой заказ на год/месяц/день на первый год. – northpole

1

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

1

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

+0

Похоже, что pub_date является строкой в ​​любом случае, при вызове STR_TO_DATE ... –

+0

Arrgh. Вы правы, как всегда, великий сэр. И ты избил меня до моего пересмотренного ответа. Я понимаю, почему есть целые вопросы, посвященные вашей удивительности. http://stackoverflow.com/questions/305223/jon-skeet-facts –

0

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

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

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