Vinzenz Mai: Sortierung

Beitrag lesen

Hallo Dominik,

Was verstehst Du unter "Datumsformat"? Ist der Datentyp der Spalte einer der Datumstypen, z.B. DATETIME oder DATE?

Sie sind im Typ DATE, also "2006-01-27"

prima, da solltest Du unbedingt eine Datums- und Zeitfunktion wie MONTH() statt SUBSTR() verwenden, d.h. extrahiere den Monat mit

MONTH(person_birth) bzw. MONTH(person_death)

Im Idealfall wäre die Abfrage so gebaut, daß wenn beide Daten im Januar liegen, der Datensatz zweimal gefunden und einsortiert wird. Wenn das nicht geht hätte das Geburtsdatum Priorität.

Dein Idealfall ist möglich, nur nicht mit Deinem Statement. Als einfachster Weg fällt mir im Augenblick UNION ein, das Deine Sortierung gerade mit erledigen kann.
UNION wird von allen üblichen Datenbankmanagementsystemen (DBMS) unterstützt, einzige mir bekannte Ausnahme ist MySQL, Version 3.x. Deswegen wäre es sehr hilfreich, wenn Du schreibst, welches DBMS in welcher Version Du benutzt.

Für MySQL könnte Deine Abfrage in etwa so aussehen, siehe dazu auch UNION:

  
(SELECT  
  spalte1,  
  -- weitere Spalten, die Du haben willst  
  DAY(person_birth) AS special_day, -- die Sortierspalte!  
  'Geburt' AS Event  
FROM persons  
WHERE MONTH(person_birth) = 1)  
UNION  
(SELECT  
  spalte1,  
  -- weitere Spalten in exakt gleicher Reihenfolge  
  DAY(person_death),  -- hier ist kein Spaltenname erforderlich, da  
                      -- dieser durch die erste Abfrage vorgegeben ist  
  'Tod'  
FROM persons  
WHERE MONTH (person_death) = 1)  
ORDER BY special_day

d.h. Ermittle in der ersten Abfrage alle Personen, die im Januar geboren sind, in der zweiten alle Personen, die im Januar gestorben sind, verbinde die Ergebnisse zu einer Gesamtergebnismenge, die Du nach dem Tag im Monat sortieren lässt. Den Aufwand dieser Abfrage solltest Du Dir mal mit EXPLAIN ausgeben lassen (bzw. ähnlichen Tools in anderen DBMS).

Es ist übrigens fast immer eine gute Idee, die Spalten, die man im Ergebnis benötigt einzeln aufzuführen und nicht einfach SELECT * zu schreiben.

Freundliche Grüße

Vinzenz