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