SQL Datensätze nach Monaten sortieren

3 Antworten

Vom Beitragsersteller als hilfreich ausgezeichnet

Meine Datensätze sehen so aus: August 2013, September 2013, Januar 2013. (Sie sind text und nicht datum.) Jetzt brauche ich sie in der richtigen Rheienfolge um sie in C# weiter zu verwenden.

Ausgehend von deinen Angaben kannst du bei der Abfrage tricksen, wenn die Servereinstellungen es zulassen:

SELECT DATENAME(mm, CAST('1.' + Spalte_mit_den_Monaten AS datetime))
FROM Tabelle_mit_den_Monaten
ORDER BY CAST('1.' + Spalte_mit_den_Monaten AS datetime)

Du kannst es aber auch erst in C# sortieren. Das ist ein durchaus übliches Verfahren; und vielleicht fällt es dir so leichter oder es macht andere Dinge deines Business-Layers einfacher?

Hier hilft dir DateTime.Parse weiter, das dir sogar erlaubt, einfach nur Monat und Jahr anzugeben und trotzdem als Datum verarbeitet zu werden.

So einfach geht das nicht in SQL, da SQL mit Monaten und Jahren ja nichts zeitlich anfangen kann in textform, heißt du mußt ein Skript schreiben, das dir einen chronoligischen Bezug erzeugt. Das ist allerding snicht so schwer.

Ergänze eine Spalte mit datum wo du den Zeitstempel reinschreiben kannst. Das Feld enthältnur zahlen vom zeitstempel.

Jetzt machst du in etwa folgendes - vom sinn her, syntax mußt du dir selbst zusammenbasteln je nach php, c oder was auch immer du verwendest:

Spalte datum_zeitstempel ergänzen

    $monate[]={Januar, Februar....Dezember}
    for $i = 1980 to 2013, ++i  {  // wähle hier deinen Jahresbereich aller Datensätze
      for $j=1 to 12 ++j {
        UPDATE deine_tabelle 
        SET datum_zeitstempel=mktime($i,$j) // mktime() erzeugt Zeitstempel aus Jahr/Monat
        WHERE dein_alter_datumspaltname LIKE $monate[$j].$i
      }
    }   

Das Skript erzeugt also zu jeder Jahr/Monatskombination einen Zeitstempel mit der mktime funktion und updatet deine Datensätze wo die Kombination aus Jahr und Monat paßt, was mit dem LIKE Operator gemacht wird. Beim Like Operator bastelst du dir im prinzip den String aus Jahr und monat zusammen nach dem in deiner Spalte gesucht werden soll also Monat+Jahr

Danach hast du deine Tabelle mit Zeitstempeln und nach denen kannst du dann chronologisch sortieren.

Syntax mußt du entsprechend anpassen, aber so wirds gemacht von der logik her :) Viel Erfolg


cavefish  16.09.2013, 13:10

Für dein Comboboxenproblem kannst du in den Zeitstempel dann einen Bereich wählen...

Select*From tabelle WHERE datum_zeitstempel >mktime(3,2001) AND datum_zeitstempel < mktime(4,2013)

Nur als Beispiel - gibt dann alle Datensätze in dem Bereich aus. Jahr Monat kannst du dann sehr leicht an die mktime Funktion übergeben

Geh doch in C# das komplette Array durch und splitte den String (z.B. August 2013) per Leerzeichen, dann wandle den Monatsnamen in ne Zahl um und häng es mit Punkt und Jahr wieder zusammen. So wird in deinem Array statt "August 2013" "08.2013" stehen.

Dann jeden Datensatz als Objekt einer Klasse ablegen und alle Objekte in ein Array. Dieses Array nun nach dem Datum des jeweiligen Objekts sortieren. siehe Hier: http://www.stoggy.net/2010/12/c-liste-mit-eigenen-objekten-sortieren-icomparer/

MfG MasterChristian


marc13 
Beitragsersteller
 16.09.2013, 12:59

danke kann mir jetzt vorstellen wie ich sie geordnet in den array reinbekomme. Nun habe ich aber das Problem. Ich habe in einer form Comboboxen wo man das Dadtum auswählen kann: August 2013 bis Januar 2014 zB. und dann solten nur die datensätze ausgegeben werden in dieser Zeitspanne. Das heisst ich brauche eine möglichkeit im string[] jetzt nur diese Zeitspanne zu haben und die die vorher und nacher sind rauszulöschen. Kann mir aber nicht vorstellen wie ich das Anstellen soll :S