Định dạng ngày và thời gian trong SQL có thể là vấn đề phức tạp đối với nhiều lập trình viên SQL mới. Nhưng đừng lo, hôm nay chúng ta sẽ cùng tìm hiểu về hàm xử lý ngày tháng trong SQL để giải quyết những thách thức này.
Giới thiệu
SQL (Structured Query Language) là ngôn ngữ lập trình mạnh mẽ được sử dụng rộng rãi trong quản lý cơ sở dữ liệu. Học và thực hành SQL không khó nếu bạn nắm vững kiến thức cơ bản.
Trong SQL, chúng ta có thể lưu trữ dữ liệu có cấu trúc và thực hiện các truy vấn đơn giản trên đó. Hôm nay, chúng ta sẽ tìm hiểu về Hàm Ngày Tháng trong SQL.
Các vấn đề phổ biến khi làm việc với DATE/TIME trong SQL
Hầu hết lập trình viên SQL đều cần làm việc với kiểu dữ liệu ngày/tháng trong SQL. Tuy nhiên, đôi khi có những vấn đề phức tạp mà các lập trình viên mới gặp phải, như:
- Không thể chèn dữ liệu vào bảng vì các định dạng ngày/tháng không khớp.
- Cần nhóm dữ liệu theo ngày/tháng trong báo cáo, nhưng định dạng ngày không đúng.
- Và nhiều vấn đề khác.
Trong trường hợp này, chúng ta cần biết cách sử dụng các hàm xử lý thời gian trong SQL.
Các hàm xử lý DATE/TIME trong SQL
Dưới đây là một số hàm thường được sử dụng để xử lý ngày/tháng trong SQL:
- ADDDATE(): Thêm một khoảng thời gian vào ngày.
- ADDTIME(): Thêm một khoảng thời gian vào thời gian.
- CONVERT_TZ(): Chuyển đổi múi giờ.
- CURDATE(): Trả về ngày hiện tại.
- CURRENT_DATE(): Trả về ngày hiện tại.
- CURRENT_TIME(): Trả về thời gian hiện tại.
- CURRENT_TIMESTAMP(): Trả về ngày và thời gian hiện tại.
- CURTIME(): Trả về thời gian hiện tại.
- DATE_ADD(): Cộng thêm một khoảng thời gian vào ngày.
- DATE_FORMAT(): Định dạng giá trị thời gian.
- DATE_SUB(): Trừ đi một khoảng thời gian từ ngày.
- DATE(): Trả về phần ngày của biểu thức thời gian.
- DATEDIFF(): Trả về chênh lệch giữa hai ngày.
- DAY(): Trả về số thứ tự ngày trong tháng (từ 0 đến 31).
- DAYNAME(): Trả về tên của ngày trong tuần.
- DAYOFMONTH(): Trả về số thứ tự ngày trong tháng (từ 0 đến 31).
- DAYOFWEEK(): Trả về chỉ số ngày trong tuần (1 = Chủ Nhật, 2 = Thứ Hai, ..., 7 = Thứ Bảy).
- DAYOFYEAR(): Trả về số thứ tự ngày trong năm (từ 1 đến 366).
- EXTRACT(): Trích xuất giá trị thời gian từ biểu thức ban đầu.
- FROM_DAYS(): Chuyển đổi một số thành giá trị ngày.
- FROM_UNIXTIME(): Trả về ngày từ giá trị Unixtime.
- HOUR(): Trả về giá trị giờ từ biểu thức thời gian.
- LAST_DAY(): Trả về ngày cuối cùng của tháng.
- LOCALTIME(): Trả về ngày giờ hiện tại theo múi giờ địa phương.
- LOCALTIMESTAMP(): Trả về ngày giờ hiện tại theo múi giờ địa phương.
- MAKEDATE(): Trả về ngày từ các tham số truyền vào.
- MAKETIME(): Trả về thời gian từ các tham số truyền vào.
- MICROSECOND(): Trả về giá trị micro giây từ biểu thức ban đầu.
- MINUTE(): Trả về giá trị phút từ biểu thức thời gian.
- MONTH(): Trả về giá trị tháng từ biểu thức thời gian.
- MONTHNAME(): Trả về tên tháng từ biểu thức thời gian.
- NOW(): Trả về ngày giờ hiện tại.
- PERIOD_ADD(): Thêm một khoảng thời gian vào tháng.
- PERIOD_DIFF(): Trả về số tháng giữa hai khoảng thời gian.
- QUARTER(): Trả về giá trị quý từ biểu thức thời gian.
- SEC_TO_TIME(): Chuyển đổi số giây thành định dạng 'HH:MM:SS'.
- SECOND(): Trả về giá trị giây từ biểu thức thời gian.
- STR_TO_DATE(): Chuyển đổi một chuỗi thành ngày.
- SUBDATE(): Trừ một khoảng thời gian từ ngày.
- SUBTIME(): Trừ hai khoảng thời gian.
- SYSDATE(): Trả về ngày giờ hiện tại.
- TIME_FORMAT(): Định dạng giá trị thời gian.
- TIME_TO_SEC(): Chuyển đổi giá trị thời gian thành giây.
- TIME(): Trả về giá trị thời gian từ biểu thức.
- TIMEDIFF(): Trả về chênh lệch giữa hai giá trị thời gian.
- TIMESTAMP(): Trả về biểu thức datetime.
- TIMESTAMPADD(): Cộng thêm một khoảng thời gian vào ngày.
- TIMESTAMPDIFF(): Trả về sự chênh lệch thời gian giữa hai biểu thức.
- TO_DAYS(): Trả về số ngày giữa một ngày và năm 0.
- UNIX_TIMESTAMP(): Trả về số giây theo Unix timestamp.
- UTC_DATE(): Trả về ngày UTC hiện tại.
- UTC_TIME(): Trả về giờ UTC hiện tại.
- UTC_TIMESTAMP(): Trả về ngày giờ UTC hiện tại.
- WEEKDAY(): Trả về chỉ số ngày trong tuần (0 = Thứ Hai, 1 = Thứ Ba, ..., 6 = Chủ Nhật).
- WEEKOFYEAR(): Trả về chỉ số tuần trong năm.
- YEAR(): Trả về năm tương ứng của biểu thức.
Các kiểu dữ liệu ngày/tháng trong SQL
MySQL hỗ trợ các kiểu dữ liệu sau để lưu trữ giá trị ngày/tháng trong cơ sở dữ liệu:
- 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.
Với các ký tự sau:
- Y là năm.
- M là tháng.
- D là ngày.
- H là giờ.
- MI là phút.
- S là giây.
Định dạng YYYY là năm dưới dạng bốn chữ số, YY là năm dưới dạng hai chữ số. Định dạng MM là tháng dưới dạng hai chữ số (ví dụ, tháng 7 sẽ là 07).
Theo dõi tạo hoặc chỉnh sửa bằng cách sử dụng TIMESTAMP
Khi làm việc với cơ sở dữ liệu, chúng ta thường cần lưu trữ thời gian tạo hoặc chỉnh sửa cuối cùng của bản ghi. Ví dụ, chúng ta có thể lưu trữ ngày và giờ khi người dùng đăng ký hoặc cập nhật thông tin.
Trong MySQL, chúng ta có thể dùng hàm NOW() để chèn ngày và giờ hiện tại:
INSERT INTO users (name, birth_date, created_at) VALUES ('Bilbo Baggins', '1998-04-16', NOW());
Tuy nhiên, nếu bạn không muốn tự động chèn ngày và giờ hiện tại, bạn có thể sử dụng thuộc tính tự động của TIMESTAMP và DATETIME.
Để sử dụng thuộc tính tự động, bạn có thể xác định mệnh đề DEFAULT CURRENT_TIMESTAMP và ON UPDATE CURRENT_TIMESTAMP trong việc định nghĩa cột:
CREATE TABLE users (
id INT(4) NOT NULL PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(50) NOT NULL UNIQUE,
birth_date DATE NOT NULL,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP,
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);
Trong phần tiếp theo, chúng ta sẽ tìm hiểu cách sử dụng tất cả các hàm này với cú pháp và ví dụ cụ thể. Hãy tiếp tục theo dõi nhé.
Bài trước: Toán tử đại diện WILDCARD trong SQL Bài tiếp: Hàm xử lý DATE/TIME trong SQL - Phần 2