age()gibt Intervalle zurück. In SQL-92 ist "an Intervaleine nicht verankerte Richtungsdauer der Zeitlinie" [1]. Sie haben zwei Typen aufgrund unterschiedlicher Monatslängen im Gregorianischen Kalender (Jahr zu Monat und Tag zu Sekunde). Oracle gibt eine Fehlermeldung aus, wenn Sie versuchen, das zu tun, was Sie getan haben . Intervalle können positiv und negativ sein. Sie müssen verankert sein, um eine genaue Bedeutung zu haben date + interval = date2. Wenn Sie Durchschnittswerte dieser Werte ermitteln, ist dies im Allgemeinen schlecht definiert. Wenn Sie sie auf Alterswerte prüfen, erhalten Sie möglicherweise immer noch unerwartete Ergebnisse (wie dies der Fall ist).
Was bedeutet a 3 month 32 daysin Postgres? Nun, nur der Code kann es mit Sicherheit sagen (oder derjenige, der es geschrieben hat). Ich denke, es bedeutet "einen Monat vorrücken, dann 32 Tage". Man kann Tage nicht in Monate umwandeln oder umgekehrt.
Wie kann es passieren, dort zu sein? Der Durchschnitt reagiert empfindlich auf Ausreißer. Wenn also tagelang ein ziemlich großer Wert vorhanden ist, hat dies einen Einfluss. Wie werden nullWerte behandelt? Haben einige Benutzer Daten für die Zukunft angegeben oder unangemessene Werte angegeben? Gibt es eine implizite Konvertierung? Haben Postgres-Entwickler eine spezielle Durchschnittsfunktion für Intervalle erstellt?
Für Ihr Problem empfehle ich die Verwendung (Entschuldigung, wenn dies nicht funktioniert, habe ich keine Datenbank zur Hand):
select avg(extract(epoch from now()) - extract(epoch from birthday)) from "user";
Dies funktioniert für Benutzer in einem angemessenen Alter. Wenn Sie jedoch Benutzer ab dem 18. Jahrhundert hatten, hängt die Antwort auch vom Standort ab, da der neue Kalender später in einigen Ländern übernommen wurde.
Lesen Sie das folgende Buch, um andere Macken mit Daten kennenzulernen.
[1] "Entwicklung zeitorientierter Datenbankanwendungen in SQL", Richard T. Snodgrass, Morgan-Kaufmann, 1999. Siehe seine Homepage , Seiten 30-32.