2014-06-07 36 views
5

Tôi có một trường dob trong bảng MySQL của tôi thuộc loại date. Chỉ một ví dụ nhỏ, tầm thường là một cái gì đó như thế này:Tính tuổi với số thập phân từ ngày sinh

mysql> select dob from players limit 5; 
+------------+ 
| dob  | 
+------------+ 
| 1983-12-02 | 
| 1979-01-01 | 
| 1989-05-11 | 
| 1976-03-24 | 
| 1989-09-12 | 
+------------+ 

Tôi đang cố gắng tính toán độ tuổi bằng dấu thập phân bằng cách sử dụng ngày hôm nay. Vì vậy, về mặt kỹ thuật nếu sinh nhật của bạn là ngày 1 tháng 6 năm 1981 hoặc 1981-06-01, điều đó khiến bạn 33 và hôm nay là ngày 7 tháng 6 .. bạn sẽ là 33.(6/365) or 33.02 years old. Cách dễ nhất để tính toán điều này bằng cách sử dụng SQL là gì?

Trả lời

5

Thường DOB tính là khá dễ dàng trong mysql khi bạn muốn tính toán năm mà không bất kỳ một cái gì đó phần như

mysql> select timestampdiff(YEAR,'1981-06-01',now()); 
+----------------------------------------+ 
| timestampdiff(YEAR,'1981-06-01',now()) | 
+----------------------------------------+ 
|          33 | 
+----------------------------------------+ 

Nhưng kể từ khi bạn cần phần còn lại thì điều này nên làm các thủ thuật

mysql> select format(datediff(curdate(),'1981-06-01')/365.25,2); 
+-----------------------------------------------------+ 
| format(datediff(curdate(),'1981-06-01')/365.25,2) | 
+-----------------------------------------------------+ 
| 33.02            | 
+-----------------------------------------------------+ 

Năm được coi là 365,25 ngày.

Vì vậy, trong trường hợp của bạn, bạn có thể truy vấn như

select 
format(datediff(curdate(),dob)/365.25,2) as dob 
from players limit 5; 
+1

+1 Đơn giản và dễ hiểu – Andomar

+0

Nếu chỉ năm là 365,25 ngày. –

1

Bạn có thể sử dụng hàm to_days để tính ngày giữa năm 0 và ngày sinh của ai đó. Sau đó trừ ngày hôm nay số ngày đó. Điều đó sẽ cung cấp cho bạn ngày sinh nhật như nếu ai đó được sinh ra trong năm zero:

select year(subdate(now(), to_days(dob))) 

Example at SQL Fiddle.

1

Tốt nhất là sử dụng các DATEDIFF() như sau:

select datediff(NOW(),date("1983-12-02"))/365;

trong đó ngày được trích dẫn là trường ngày của bạn, vì vậy ví dụ của bạn sẽ chuyển thành:

select datediff(NOW(),date(dob))/365 from players limit 5;

Kết quả được trả về sẽ là số năm kể từ ngày ra đời đến 4 chữ số thập phân. Nếu bạn thích hai chữ số thập phân sử dụng truncate() như sau:

truncate(datediff(NOW(),date("1983-12-02"))/365,2);

1

Có một vài vấn đề. bạn đang sử dụng 365 làm số ngày trong một năm và bỏ qua năm nhuận. Cách đơn giản nhất để làm điều này sẽ

select datediff(now(), '1981-06-01')/365.25; 

Khi bạn sử dụng 365,25 nó sẽ lây lan các năm nhuận và bạn sẽ ổn thôi. MySQL cho biết giá trị này là 33.0157. khi bạn làm tròn nó thành hai số thập phân, bạn sẽ ổn thôi.

Các vấn đề liên quan