age()
trả về khoảng thời gian. Trong SQL-92 "an Interval
là khoảng thời gian định hướng chưa được lưu trữ của dòng thời gian" [1]. Chúng có hai loại do độ dài tháng khác nhau trong lịch Gregorian (năm này sang tháng khác và ngày này sang ngày thứ hai). Oracle cung cấp cho bạn một thông báo lỗi, nếu bạn cố gắng làm những gì bạn đã làm . Khoảng có thể là tích cực và tiêu cực. Chúng cần được neo để có một ý nghĩa chính xác, như thế nào date + interval = date2
. Nói chung, việc lấy trung bình của các giá trị này là không xác định rõ ràng và việc thử giá trị tuổi này vẫn có thể mang lại cho bạn kết quả không mong muốn (như vậy).
Vậy ý nghĩa của a 3 month 32 days
trong Postgres là gì? Vâng, chỉ có mã có thể nói (hoặc người đã viết nó) chắc chắn. Tôi đoán nó có nghĩa là "tạm ứng một tháng, sau đó 32 ngày". Người ta không thể chuyển đổi ngày sang tháng hoặc ngược lại.
Làm thế nào nó có thể xảy ra ở đó? Trung bình là nhạy cảm với các ngoại lệ, vì vậy nếu một số giá trị khá lớn ở đó trong nhiều ngày, nó sẽ có ảnh hưởng. Làm thế nào được null
giá trị xử lý? Có phải một số người dùng chỉ định ngày trong tương lai hoặc đưa ra các giá trị không hợp lý? Có một số chuyển đổi ngầm đang diễn ra? Các nhà phát triển Postgres đã tạo ra một hàm trung bình đặc biệt trong các khoảng thời gian chưa?
Đối với vấn đề của bạn, tôi khuyên bạn nên sử dụng (xin lỗi nếu điều này không hoạt động, tôi không có cơ sở dữ liệu trong tay):
select avg(extract(epoch from now()) - extract(epoch from birthday)) from "user";
Điều này hoạt động cho người dùng ở độ tuổi hợp lý, nhưng nếu bạn có người dùng từ năm 1700, câu trả lời cũng sẽ phụ thuộc vào địa điểm, vì lịch mới đã được thông qua sau đó ở một số quốc gia.
Đọc cuốn sách sau đây để biết các quirks khác với ngày.
[1] "Phát triển các ứng dụng cơ sở dữ liệu định hướng thời gian trong SQL", Richard T Snodgrass, Morgan-Kaufmann, 1999. Xem trang chủ của anh ấy , Trang 30-32.