SQL là một ngôn ngữ truy vấn mạnh mẽ, và việc xử lý ngày tháng là một phần quan trọng trong nhiều ứng dụng. Bài viết này sẽ đi sâu vào cách Tính Tuổi Trong Sql một cách hiệu quả, cùng với các kỹ thuật liên quan khác để làm việc với dữ liệu ngày tháng.
Các Kiểu Dữ Liệu Ngày Tháng Trong SQL
Trước khi đi vào tính toán tuổi, chúng ta cần hiểu các kiểu dữ liệu ngày tháng phổ biến trong SQL:
- DATE: Lưu trữ ngày (YYYY-MM-DD).
- DATETIME: Lưu trữ ngày và thời gian (YYYY-MM-DD HH:MI:SS).
- TIMESTAMP: Lưu trữ dấu thời gian (YYYY-MM-DD HH:MI:SS), thường được sử dụng để theo dõi thời điểm một bản ghi được tạo hoặc cập nhật.
- YEAR: Lưu trữ năm (YYYY hoặc YY).
Tùy thuộc vào hệ quản trị cơ sở dữ liệu (DBMS) bạn đang sử dụng (MySQL, SQL Server, PostgreSQL,…), các kiểu dữ liệu và cú pháp có thể hơi khác nhau.
Các Hàm SQL Hữu Ích Để Tính Toán Với Ngày Tháng
SQL cung cấp một loạt các hàm để làm việc với ngày tháng. Dưới đây là một số hàm quan trọng thường dùng trong việc tính tuổi trong SQL:
Hàm | Chức năng |
---|---|
DATE() | Trả về phần ngày từ một biểu thức datetime. |
CURDATE() | Trả về ngày hiện tại của hệ thống. |
YEAR() | Trả về năm từ một ngày chỉ định. |
MONTH() | Trả về tháng từ một ngày chỉ định. |
DAY() | Trả về ngày trong tháng từ một ngày chỉ định. |
TIME() | Trả về phần giờ từ một ngày chỉ định. |
DATE_ADD() | Cộng một khoảng thời gian vào một ngày. |
DATEDIFF() | Trả về sự khác biệt giữa hai ngày. |
DATE_SUB() | Trừ một khoảng thời gian từ một ngày. |
NOW() | Trả về thời gian hiện tại. |
DAYOFWEEK() | Trả về ngày trong tuần (1 = Chủ nhật, 2 = Thứ Hai,…). |
DAYNAME() | Trả về tên của ngày trong tuần. |
MONTHNAME() | Trả về tên của tháng. |
STR_TO_DATE() | Chuyển đổi một chuỗi thành định dạng ngày. |
Ví Dụ Minh Họa Cách Tính Tuổi Trong SQL
Để minh họa cách tính tuổi trong SQL, chúng ta sẽ sử dụng một bảng dữ liệu mẫu có tên là Friends
chứa thông tin về bạn bè:
CREATE TABLE Friends (
First_name VARCHAR(255),
Last_name VARCHAR(255),
Birthday DATE
);
INSERT INTO Friends (First_name, Last_name, Birthday) VALUES
('Le Thi', 'Thu', '1996-12-12'),
('Vu Thi', 'Nga', '1997-11-17'),
('Nguyen Van', 'C', '2000-12-17'),
('Pham Van', 'D', '1998-10-11'),
('Tran Dinh', 'Trong', '1997-04-25'),
('Bui Tien', 'Dung', '1997-02-28');
Bảng Friends
có ba cột: First_name
, Last_name
, và Birthday
.
Tính tuổi dựa trên ngày hiện tại
Cách phổ biến nhất để tính tuổi trong SQL là sử dụng hàm DATEDIFF()
để tính số ngày giữa ngày sinh và ngày hiện tại, sau đó chia cho 365 (hoặc 365.25 để tính đến năm nhuận) và làm tròn.
SELECT
First_name,
Last_name,
ROUND(DATEDIFF(CURDATE(), Birthday) / 365.25, 0) AS Age
FROM
Friends;
Trong ví dụ này:
CURDATE()
trả về ngày hiện tại.DATEDIFF(CURDATE(), Birthday)
tính số ngày giữa ngày hiện tại và ngày sinh./ 365.25
chia số ngày cho 365.25 để chuyển đổi thành năm.ROUND(..., 0)
làm tròn kết quả đến số nguyên gần nhất.
Kết quả trả về sẽ là một bảng chứa tên và tuổi của mỗi người bạn.
Một cách khác để tính tuổi
Một phương pháp khác để tính tuổi trong SQL là sử dụng kết hợp các hàm YEAR()
và RIGHT()
:
SELECT
First_name,
Last_name,
(YEAR(CURDATE()) - YEAR(Birthday)) - (RIGHT(CURDATE(), 5) < RIGHT(Birthday, 5)) AS Age
FROM
Friends;
Phương pháp này hoạt động bằng cách:
- Tính sự khác biệt giữa năm hiện tại và năm sinh.
- So sánh tháng và ngày hiện tại với tháng và ngày sinh. Nếu ngày sinh nhật chưa đến trong năm nay, trừ 1 từ kết quả.
Alt text
: Câu lệnh SQL minh họa cách tính tuổi bằng cách sử dụng hàm YEAR() và RIGHT() để xác định số tuổi chính xác dựa trên ngày hiện tại và ngày sinh nhật.
Sắp xếp kết quả theo tuổi
Bạn có thể sắp xếp danh sách bạn bè theo tuổi bằng cách sử dụng mệnh đề ORDER BY
:
SELECT
First_name,
Last_name,
ROUND(DATEDIFF(CURDATE(), Birthday) / 365.25, 0) AS Age
FROM
Friends
ORDER BY
Age ASC; -- Sắp xếp tăng dần
-- Hoặc
ORDER BY
Age DESC; -- Sắp xếp giảm dần
Các Thao Tác Khác Với Ngày Tháng Trong SQL
Ngoài việc tính tuổi trong SQL, bạn cũng có thể thực hiện nhiều thao tác khác với ngày tháng, chẳng hạn như:
Tìm ngày sinh nhật trong tuần
Bạn có thể sử dụng hàm DAYNAME()
để tìm ngày trong tuần mà một người sinh ra:
SELECT
First_name,
Last_name,
Birthday,
DAYNAME(Birthday) AS DayOfWeek
FROM
Friends;
Alt text
: Kết quả truy vấn SQL hiển thị danh sách tên người và ngày sinh nhật, kèm theo tên thứ trong tuần tương ứng với ngày sinh đó, ví dụ “Le Thi Thu” sinh vào thứ năm.
Thống kê số lượng sinh nhật theo tháng
Bạn có thể sử dụng hàm MONTHNAME()
và GROUP BY
để thống kê số lượng sinh nhật trong mỗi tháng:
SELECT
MONTHNAME(Birthday) AS BirthMonth,
COUNT(*) AS NumberOfBirthdays
FROM
Friends
GROUP BY
BirthMonth
ORDER BY
MONTH(Birthday);
Alt text
: Bảng thống kê từ truy vấn SQL cho thấy số lượng sinh nhật trong mỗi tháng, ví dụ tháng 2 có 1 sinh nhật, tháng 4 có 1 sinh nhật, tháng 10 có 1 sinh nhật, v.v.
Chuyển đổi chuỗi thành ngày
Nếu bạn cần nhập ngày từ một chuỗi, bạn có thể sử dụng hàm STR_TO_DATE()
:
SELECT STR_TO_DATE("August 10 2017", "%M %d %Y");
Lọc dữ liệu theo khoảng ngày
Bạn có thể sử dụng mệnh đề BETWEEN
để lọc dữ liệu trong một khoảng ngày cụ thể:
SELECT
*
FROM
Friends
WHERE
Birthday BETWEEN '1996-10-05 00:00:00' AND '1997-01-01 23:59:59';
Alt text
: Bảng kết quả truy vấn SQL hiển thị danh sách người có ngày sinh nhật nằm trong khoảng từ ‘1996-10-05 00:00:00’ đến ‘1996-12-25 23:59:59’.
Kết Luận
Bài viết này đã trình bày chi tiết cách tính tuổi trong SQL và các kỹ thuật liên quan đến xử lý ngày tháng. Bằng cách sử dụng các hàm và cú pháp được cung cấp, bạn có thể dễ dàng thực hiện các thao tác phức tạp với dữ liệu ngày tháng trong cơ sở dữ liệu của mình. Hãy thực hành thường xuyên để nắm vững những kỹ năng này và áp dụng chúng vào các dự án thực tế.