Trong quá trình làm việc tính toán với cơ sở dữ liệu MySQL, việc thao tác với các dữ liệu dạng thời gian là không thể tránh khỏi, đây cũng là vẫn đề khá rắc rối đối với những người mới làm quen với cơ sở dữ liệu này. Do đó qua bài viết này chúng ta hãy cùng tìm hiểu một số vấn đề cơ bản xoay quanh việc xử lý với kiểu dữ liệu dạng thời gian.
Các kiểu dữ liệu thời gian trong MySQL
- DATE – format YYYY-MM-DD
- DATETIME – format: YYYY-MM-DD HH:MI:SS
- TIMESTAMP – format: YYYY-MM-DD HH:MI:SS
Vấn đề thường gặp phải với kiểu dữ liệu thời gian
Như ở phần 1 đã liệt kê các format mặc định của các kiểu dữ liệu dạng thời gian, do đó nếu thao tác bình thường với các kiểu dữ liệu này ví dụ như insert bản ghi và ta truyền dữ liệu của trường có kiểu thời gian này đính định dạng theo datatype thì sẽ không có vấn đề gì xảy ra. Hoặc khi ta thực hiện select dữ liệu từ bảng có trường có datatype là thời gian thì dữ liệu trả về cũng sẽ theo đúng các định dạng tương ứng như trên.
Ví dụ: ta có bảng nhanvien với trường NGSINH có kiểu dữ liệu là date như sau:
CREATE TABLE NHANVIEN ( HONV NVARCHAR(15), TENLOT NVARCHAR(15), TENNV NVARCHAR(15), MANV NVARCHAR(9) NOT NULL, NGSINH DATE, DCHI NVARCHAR(30), PHAI NVARCHAR(3), LUONG FLOAT, MA_NQL NVARCHAR(9), PHG INT NOT NULL, PRIMARY KEY (MANV) )
Ta thực hiện thêm bản ghi bằng câu lệnh:
INSERT INTO `NHANVIEN` VALUES ('LÊ', 'QUỲNH', 'NHƯ', '001', '1967-02-01', '291 Hồ Văn Hue, Tp HCM', 'Nữ', 56000, '006', 4);
Như ta thấy dữ liệu ở trường NGSINH được truyền đúng định dạng mặc định mà MySQL hiểu nên câu lệnh này thành công.
Nhưng nếu với cách truyền sai định dạng mặc định date vào trường NGSINH thì sao?
Ta thực hiện câu lệnh
INSERT INTO `NHANVIEN` VALUES ('NGUYỄN', 'MẠNH', 'HÙNG', '004', '04-03-2000', '95 Bà Rịa Vũng Tàu', 'Nam', 38000, '005', 5);
Kết quả:
>Error Code: 1292. Incorrect date value: '04-03-2000' for column 'NGSINH' at row 1
Như vậy MySQL không thể nhận dạng được NGSINH này để thực hiện câu lệnh insert. Làm thế nào để xử lý vấn đề này
Hàm STR_TO_DATE
Mô tả
Hàm STR_TO_DATE lấy một chuỗi và trả về một ngày được chỉ định bởi mặt nạ định dạng.
Cú pháp
STR_TO_DATE ( string, format_mask )
Giải thích:
- string: Giá trị chuỗi để định dạng là một ngày.
- format_mask: Các định dạng để áp dụng cho string.
Sau đây là danh sách các tùy chọn cho tham số format_mask.
Giá trị | Mô tả |
%a | Viết tắt tên ngày trong tuần (Sun – Sat) |
%b | Viết tắt tên tháng (Jan đến Dec) |
%c | Tháng dưới dạng giá trị số (0 đến 12) |
%D | Ngày trong tháng dưới dạng giá trị số, theo sau là hậu tố (1st, 2nd, 3rd, …) |
%d | Ngày trong tháng dưới dạng giá trị số (01 đến 31) |
%e | Ngày trong tháng dưới dạng giá trị số (1 đến 31) |
%f | Giây (000000 đến 999999) |
%H | Hour (00 đến 23) |
%h hoặc %l | Giờ (00 đến 12) |
%i | Phút (00 đến 59) |
%j | Ngày trong năm (001 đến 366) |
%k | Giờ (00 đến 23) |
%l | Giờ (1 đến 12) |
%M | Tên tháng đầy đủ (January đến December) |
%m | Tên tháng dưới dạng giá trị số (00 đến 12) |
%p | AM hoặc PM |
%r | Thời gian ở định dạng 12 giờ AM hoặc PM (hh: mm: ss AM / PM) |
%S | Giây (00 đến 59) |
%s | Giây (00 đến 59) |
%T | Thời gian ở định dạng 24 giờ (hh: mm: ss) |
%U | Tuần mà Chủ nhật là ngày đầu tuần (00 đến 53) |
%u | Tuần mà thứ Hai là ngày đầu tuần (00 đến 53) |
%V | Tuần mà Chủ nhật là ngày đầu tuần (01 đến 53) |
%v | Tuần mà thứ Hai là ngày đầu tuần (01 đến 53) |
%W | Tên ngày trong tuần đầy đủ (Sunday đến Saturday) |
%w | Ngày trong tuần trong đó Chủ nhật = 0 và Thứ bảy = 6 |
%X | Năm trong tuần mà Chủ nhật là ngày đầu tuần |
%x | Năm trong tuần, thứ Hai là ngày đầu tuần |
%Y | Năm dưới dạng giá trị số, 4 chữ số |
%y | Năm dưới dạng giá trị số, 2 chữ số |
Ví dụ: Chúng ta cùng quay lại vấn đề đầu tiên đã nêu ở trên với câu lệnh nhưng ta sử dụng hàm STR_TO_DATE(), với việc khai báo đúng định dạng ngày-tháng-năm của chuỗi ’04-03-2000′
SQL> INSERT INTO `NHANVIEN` VALUES ('NGUYỄN', 'MẠNH', 'HÙNG', '004', STR_TO_DATE('04-03-2000', '%d-%c-%Y'), '95 Bà Rịa Vũng Tàu', 'Nam', 38000, '005', 5);
Và kết quả thực hiện là bản ghi được insert thành công
Kết luận
Thông qua bài viết chúng ta đã tìm hiểu được cách sử dụng hàm STR_TO_DATE() để có thể làm việc dễ dàng hơn với các dữ liệu kiểu thời gian trong MySQL, đây là một hàm rất mạnh và được các nhà phát triển sử dụng rất nhiều. Rất vui khi có thể chia sẻ kiến thức này cho các bạn. Để tìm hiểu thêm các kiến thức hay khác về SQL bạn có thể tham khảo link dưới đây.