Xem thêm

Tính toán và Xử lí ngày tháng bằng câu lệnh SQL

Huy Erick
Bạn có từng gặp phải vấn đề về tính toán và xử lí ngày tháng trong câu lệnh SQL? Trong bài viết này, chúng tôi sẽ chia sẻ với bạn một số kiến thức cơ...

Tính toán và xử lí ngày tháng bằng câu lệnh SQL

Bạn có từng gặp phải vấn đề về tính toán và xử lí ngày tháng trong câu lệnh SQL? Trong bài viết này, chúng tôi sẽ chia sẻ với bạn một số kiến thức cơ bản về việc làm việc với ngày tháng trong các cơ sở dữ liệu MySQL và SQL Server.

MySQL và SQL Server - Các loại dữ liệu ngày tháng

Đầu tiên, chúng ta cần biết các loại dữ liệu ngày tháng được hỗ trợ trong MySQL và SQL Server. Dưới đây là các loại dữ liệu ngày tháng trong mỗi hệ thống:

MySQL:

  • Date: Định dạng YYYY-MM-DD
  • DATETIME: Định dạng YYYY-MM-DD HH:MI:SS
  • TIMESTAMP: Định dạng YYYY-MM-DD HH:MI:SS
  • YEAR: Định dạng YYYY hoặc YY

SQL Server:

  • DATE: Định dạng YYYY-MM-DD
  • DATETIME: Định dạng YYYY-MM-DD HH:MI:SS
  • SMALLDATETIME: Định dạng YYYY-MM-DD HH:MI:SS
  • TIMESTAMP: Số duy nhất

Các hàm xử lí ngày tháng trong MySQL và SQL Server

Cả MySQL và SQL Server cung cấp một loạt các hàm để xử lí ngày tháng trong câu lệnh SQL. Dưới đây là một số hàm quan trọng mà chúng ta thường sử dụng:

  • DATE(): Trả về ngày từ biểu thức datetime
  • CURDATE(): Trả về ngày hiện tại của máy tính
  • YEAR(): Trả về năm của ngày đã chỉ định
  • MONTH(): Trả về tháng của ngày đã chỉ định
  • DAY(): Trả về ngày của ngày đã chỉ định
  • TIME(): Trả về giờ của ngày đã chỉ định
  • DATE_ADD(): Trả về ngày từ biểu thức datetime
  • DATEDIFF(): Trả về số ngày giữa hai giá trị ngày
  • DATE_SUB(): Trả về ngày từ biểu thức datetime
  • NOW(): Trả về thời gian hiện tại
  • DAYOFWEEK(): Trả về ngày của tuần
  • DAYNAME(): Trả về tên ngày
  • MONTHNAME(): Trả về tên tháng
  • STR_TO_DATE(): Định dạng chuỗi thành ngày

Còn rất nhiều hàm khác mà chúng ta có thể sử dụng, nhưng ở đây chúng tôi chỉ trình bày một số hàm quan trọng.

3.1 Còn bao nhiêu ngày nữa?

Câu hỏi này luôn xuất hiện trong đầu chúng ta ít nhất mỗi tuần, đúng không? MySQL giải quyết câu hỏi này với hàm DATEDIFF(). Hàm này trừ hai giá trị ngày và trả về số ngày giữa chúng. Ví dụ:

SELECT DATEDIFF(CURDATE(), birthday) AS days_difference FROM friends LIMIT 5;

Kết quả sẽ trả về số ngày giữa ngày hiện tại và ngày sinh nhật của bạn. Sau khi có số ngày, bạn có thể tính được tuổi của người đó cho năm hiện tại bằng cách chia cho 365. Ví dụ:

SELECT ROUND(DATEDIFF(CURDATE(), birthday) / 365, 0) AS years FROM friends LIMIT 5;

Ở đây, chúng ta sử dụng hàm ROUND() để làm tròn kết quả thành một số nguyên.

Bạn cũng có thể tính toán tuổi của bạn bè bằng cách sử dụng công thức sau:

SELECT first_name, last_name, (YEAR(CURDATE()) - YEAR(birthday)) - (RIGHT(CURDATE(), 5) < RIGHT(birthday, 5)) AS years FROM friends;

3.2 Chúng ta không bao giờ quên sinh nhật, phải không?

Giả sử chúng ta muốn biết ngày trong tuần là sinh nhật của một người bạn. Có lẽ chúng ta sẽ kiểm tra bảng friends hàng tuần để biết ai sắp sinh nhật và ghi chú ngày hôm nay là thứ mấy. Hàm DAYOFWEEK() trả về một giá trị số cho một giá trị ngày và thứ tự của ngày đó (1 là Chủ Nhật, 2 là Thứ Hai, v.v.). Chúng ta có thể sử dụng một biểu thức CASE để hiển thị tên của ngày. Ví dụ:

SELECT first_name, last_name, birthday, 
  CASE 
    WHEN DAYOFWEEK(birthday) = '1' THEN 'Chủ nhật'
    WHEN DAYOFWEEK(birthday) = '2' THEN 'Thứ hai'
    WHEN DAYOFWEEK(birthday) = '3' THEN 'Thứ ba'
    WHEN DAYOFWEEK(birthday) = '4' THEN 'Thứ tư'
    WHEN DAYOFWEEK(birthday) = '5' THEN 'Thứ năm'
    WHEN DAYOFWEEK(birthday) = '6' THEN 'Thứ sáu'
    WHEN DAYOFWEEK(birthday) = '7' THEN 'Thứ bảy'
    ELSE 'Không phải là một ngày trong tuần' 
  END AS day_of_week 
FROM friends LIMIT 10;

3.3 Xử lí tháng

Các hàm MONTH() được sử dụng để lấy các giá trị số theo tháng từ một giá trị ngày tháng đã cho. Ví dụ:

SELECT (MONTH(birthday)) AS month, COUNT(*) AS number_of_birthdays FROM friends GROUP BY month ORDER BY month ASC;

Truy vấn trên trả về số lượng người có ngày sinh nhật trong mỗi tháng.

Nếu bạn muốn lấy tên của tháng, bạn có thể sử dụng hàm MONTHNAME(). Ví dụ:

SELECT DISTINCT (MONTHNAME(birthday)) AS month, COUNT(*) AS number_of_birthdays FROM friends GROUP BY month;

3.4 Xử lí ngày

Khi bạn thêm một người bạn mới vào danh sách, bạn có thể nhập ngày sinh dưới dạng chuỗi như 'ngày 10, tháng 08 năm 2017'. Bạn có thể sử dụng hàm STR_TO_DATE() để chuyển đổi chuỗi này thành giá trị ngày. Ví dụ:

SELECT STR_TO_DATE("August 10 2017", "%M %d %Y");

Ở đây, %M %d %Y định dạng chuỗi thành %M - Tên tháng, %d - Số ngày trong tháng, %Y - 4 chữ số năm.

3.5 Ngày không được NULL

Đôi khi, chúng ta muốn kiểm tra xem giá trị ngày có phải là NULL hay không. Bạn có thể sử dụng mệnh đề WHERE để kiểm tra điều này. Ví dụ:

SELECT first_name, last_name, birthday FROM friends WHERE birthday IS NOT NULL;

Truy vấn MySQL trên sẽ lọc ra các hàng có giá trị ngày sinh khác NULL.

3.6 Lấy ra những ngày trong khoảng từ ngày... đến ngày...

Bạn cũng có thể lấy ra các bản ghi có ngày nằm trong một khoảng ngày đã xác định bằng mệnh đề BETWEEN. Ví dụ:

SELECT * FROM friends WHERE birthday BETWEEN '1996-10-05 00:00:00' AND '1996-12-25 23:59:59';

Đây là một số ví dụ thực tế về việc tính toán và xử lí ngày tháng bằng câu lệnh SQL. Bài viết còn nhiều thiếu sót, chúng tôi rất mong nhận được sự góp ý và đóng góp của bạn để bài viết được hoàn thiện hơn.

Tài liệu tham khảo:

1