câu trả lời Bryan Denny là hơn đúng hơn là câu trả lời chấp nhận (Tôi đã không chắc chắn như thế nào để đặt điều này ở một nơi khác ngoài câu trả lời mới, đây là lần đầu tiên tôi sử dụng StackOverflow).
Marcos' nỗ lực đầu tiên:
select DATEDIFF(customer.dob, '2010-01-01')/365.25 as age
trước hết sẽ mang lại một kết quả tiêu cực (các đối số DATEDIFF là theo thứ tự sai), và thứ hai sẽ tạo ra kết quả không chính xác đối với một số ngày, ví dụ:
SELECT DATEDIFF('2010-05-11','1984-05-11')/365.25 AS age
tạo ra kết quả:
25.9986
Bạn không thể chỉ đơn giản là luôn làm tròn lên, bởi vì điều đó cũng sẽ gây ra kết quả không chính xác cho các đầu vào khác. nỗ lực thứ hai
Marcos':
SELECT DATE_FORMAT(FROM_DAYS(DATEDIFF(customer.dob,'2010-01-01')), ‘%Y’)+0 AS age
Một lần nữa, các đối số theo thứ tự sai, ngoại trừ thời gian này thay vì chỉ sản xuất một số âm, FROM_DAYS() chức năng không hoạt động đúng với đầu vào tiêu cực. Thứ hai, nếu chúng ta nhìn sâu hơn về đầu ra của FROM_DAYS() chức năng:
select from_days(datediff('2010-09-16','1984-05-11'));
Kết quả trên là:
0026-05-08
mà nghĩa đen là "ngày 08 tháng 5, năm 26 (sau 0) ". Hãy nhớ rằng đối với các loại ngày giờ, không có tháng "0", vì vậy nếu bạn muốn sử dụng định dạng này để đo khoảng thời gian có tháng bao gồm, bạn phải trừ 1 từ tháng. Tương tự, với các thành phần ngày, không có "0", do đó kết quả không phải là điều bạn mong muốn cho vấn đề này khi ngày sẽ xảy ra là sinh nhật:
select from_days(datediff('2010-05-11','1984-05-11'));
sản xuất:
0025-12-31
nếu chúng ta rút ngắn bằng cách sử dụng định dạng ngày Marcos 'sẽ cho chúng ta "25", đây là cách tính tuổi không chính xác.
Câu trả lời của Bryan Denny là chính xác trong tất cả các trường hợp cạnh này. Công thức của anh ta khá thông minh:
SELECT DATE_FORMAT(reference, '%Y') - DATE_FORMAT(birthdate, '%Y') - (DATE_FORMAT(reference, '00-%m-%d') < DATE_FORMAT(birthdate, '00-%m-%d')) AS age
Phần đầu tiên tính chênh lệch năm giữa hai ngày. Vì vậy, nếu chúng ta lấy "2010" và "1984" làm tham chiếu và ngày sinh tương ứng, kết quả là "26". Phần thứ hai sau đó tính toán về cơ bản "Tháng và ngày sinh có xảy ra sau tháng và ngày tham chiếu không?" Nếu có, nó "chưa xảy ra", vì vậy chúng ta cần trừ một số 1 từ sự khác biệt trong năm để bù đắp cho điều này. Điều này được xử lý bởi kết quả của so sánh <, trả về 1 nếu đúng và 0 nếu sai.
Vì vậy, đầy đủ ví dụ:
1)
Reference date: 2010-05-10;
Birthdate: 1984-05-11
Year difference = 2010 - 1984 = 26
Month and day comparison: May 10th < May 11th? Yes => subtract an additional year
Calculated age: 25 years
2)
Reference date: 2010-05-11;
Birthdate: 1984-05-11
Year difference = 2010 - 1984 = 26
Month and day comparison: May 11th < May 11th? No => subtract 0
Calculated age: 26 years
Tôi hy vọng điều này làm cho mọi thứ rõ ràng hơn cho mọi người!
thats tuyệt vời! cảm ơn rất nhiều! –
Vui vì nó đã giúp bạn. Vui lòng đánh dấu câu trả lời là được chấp nhận, vì vậy những người khác có thể sử dụng câu trả lời trong tương lai :-) –
Tôi tò mò: 0.25 là gì? – ryanprayogo