2009-06-02 1 views
1

Ich frage mich, ob jemand schon einmal auf dieses Problem gestoßen ist.
Ich habe eine Zeichenfolge in ein Datum konvertiert und aufsteigend sortiert. Das Datum wird numerisch sortiert, sortiert aber nicht nach Monat. Ich frage mich, ob jemand dieses Problem hatte und einen Einblick darüber geben kann, wie man das Datum richtig sortieren kann.Warum werden meine Daten nicht korrekt sortiert?

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 

Die oben ist der Code und es funktioniert, aber das Datum ist die Sortierung zB nicht sortiert es wie folgt aus:

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

ist "pub_date" ein String-Feld in der Tabelle? –

Antwort

4

Okay, ich war vorher etwas verwirrt. Die ursprüngliche Abfrage ist etwas verwirrend, wenn Sie pub_date in der Liste der Spalten und dann eine als pub_date auswählen. Sie haben dann jedoch nach der pub_date-Spalte (effektiv sortdate as pub_date) sortiert - die eine String-Spalte zu sein scheint.

Ihre Bestellung auf der Säule nach Umstellung auf ein Datum sein sollte, aber vor Umwandlung in einen String:

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 

Bitte beachte, dass ich die „formatiert“ Version formatted_date umbenannt haben. Es ist nicht klar, ob Sie immer noch das Original pub_date auswählen müssen oder nicht. Es ist möglich, dass die formatted_date Bit sein könnte:

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

aber ich bin nicht ganz sicher. Ich hoffe, dass der Abfrageoptimierer das sowieso herausfinden würde.

Muss Ihre pub_date Spalte wirklich eine Zeichenfolge sein? Warum sollte man es nicht als geeigneteren Typ in der Datenbank behalten, um mit dem Parsen zu beginnen?

+0

Vielen Dank, das hat funktioniert, ich musste es leicht ändern, indem Sie das AS formatierte_Datum fallen lassen. Dies ist der Arbeitscode - "SELECT u.url_id, URL, Titel, Beschreibung, pub_date, STR_TO_DATE (pub_date, '% d-% b-% Y') AS Sortierdatum, DATE_FORMAT (STR_TO_DATE (pub_date, '% d-% b -% Y '),'% d.% B.% Y ') VON URLs AS u, URL_Assoziationen AS ua WHERE u.url_id = ua.url_id UND ua.url_category_id = $ typ AND ua.approved =' Y'ORDER BY Sortierdatum DESC "; – Ddywalgi

+0

Vielen Dank, das Datum ist eine JavaScript-Drop-Kalenderauswahl, die eine versteckte Zeichenfolge an die Datenbank übergibt. Ich versuche nun, das Datum in ein Format zu konvertieren, das von einem RSS validiert wird. Vielen Dank für deine Hilfe. Ich bin ziemlich neu und die Daten haben mich drehen. Nochmals vielen Dank Jon und alle, die gepostet haben, Sie waren alle sehr hilfreich. – Ddywalgi

+0

Wie lautet dann der DATE_FORMAT-Wert (in Form eines Spaltennamens)? Meine SQL-Fu ist ziemlich schwach, aber ich kann nicht sehen, warum es mit einem Namen scheitern würde ... –

-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"; 

versuchen, das Problem ist, dass Sie haben

pub_date AS sort_date 

innerhalb der Abfrage, und so, wenn y Sie sortieren nach Sortierdatum nach der Zeichenfolge. Ersetzen Sie die Sortierreihenfolge von

ORDER BY pub_date DESC 

und alles sollte funktionieren.

+0

Hallo Nathaniel, ich benutze diese aktuelle Syntax, aber es wird nicht das Datum Monat absteigend sortieren. // "SELECT u.url_id, URL, Titel, Beschreibung, pub_date, DATE_FORMAT (STR_TO_DATE (pub_datum, '% d-% b-% Y'), '% Y.% m.% D') FROM URLs AS u , url_associations AS ua WHERE u.url_id = ua.url_id UND ua.url_category_id = $ typ AND ua.approved = 'Y' ORDER BY pub_date DESC "; // Vielen Dank für Ihre Hilfe – Ddywalgi

+0

Das Problem ist, dass Sie jetzt auswählen nur pub_date, was eine Zeichenkette ist. Wenn Sie diese Abfrage verwenden, sollten Sie ORBY by Sie DESC. –

4

Ich hatte ähnliche Probleme. Was ich getan habe (und nur mit ORACLE), ist das date_format in Ihrer Bestellung anstelle des bereits formatierten Datums.

so in Ihrer Bestellung durch Nutzung:

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

oder - das wird erst nach dem Jahr

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

Das wird immer noch nach einem * string * anstatt nach einem * Datum sortiert, oder? –

+0

leider habe ich nur heute Zugriff auf ORACLE, so kann ich nicht überprüfen, in ORACLE ich gerade getestet und es funktioniert ordnungsgemäß mit der to_char (created_dt, 'dd/MON/yyyy'), die auch eine Zeichenfolge zurückgibt. Die Begrenzung ist, dass es die Tage, dann die Monate macht. Sie können es immer noch mit einer zusätzlichen date_format Zeichenfolge in der Reihenfolge durch weitere Reihenfolge der Monate – northpole

+0

oder Sie können sogar Ihre Bestellung bis zum Jahr/Monat/Tag Bestellung von Jahr zuerst. – northpole

1

Es sieht aus wie "pub_date" ist ein String-Feld? Wenn dies der Fall ist, müssen Sie es in datetime konvertieren, damit die Sortierung wie erwartet funktioniert.

1

Sie erzählen die Abfrage auf der konvertierten Zeichenfolge zu sortieren, was bedeutet, dass es auf einem String und kein Datum Sortierung tut. Versuchen Sie stattdessen, pub_date zu bestellen.

+0

Es sieht aus wie pub_date ist eine Zeichenfolge sowieso, angesichts der Aufruf von STR_TO_DATE ... –

+0

Arrgh. Sie sind wie immer korrekt, großer Herr. Und du hast mich zu meiner überarbeiteten Antwort geschlagen. Ich sehe, warum es ganze Fragen gibt, die deiner Großartigkeit gewidmet sind. http://StackOverflow.com/questions/305223/Jon-Skeet-Facts –

0

Sie wollen wie diese sortieren ..

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

Aber wenn ich darf, methinks sollten Sie erwägen Basisspalte von Zeichenfolge Datum zu ändern - viele Gründe: Skalierbarkeit, Performance, Wartbarkeit, Datenintegrität, bla Yada Yada.