SQL - Ngày & Giờ: Hướng dẫn chi tiết cho người mới bắt đầu

Xin chào các bạn tương lai của các phù thủy cơ sở dữ liệu! Hôm nay, chúng ta sẽ khám phá thế giới kỳ diệu của ngày và giờ trong SQL. Là người giáo viên máy tính gần gũi của bạn, tôi sẽ hướng dẫn bạn qua hành trình này với rất nhiều ví dụ và giải thích. Vậy, hãy chuẩn bị máy thời gian ảo của bạn, và chúng ta cùng bắt đầu!

SQL - Date & Time

Loại dữ liệu Ngày & Giờ trong SQL

Trước khi chúng ta bắt đầu manipulates ngày và giờ, chúng ta cần hiểu cách SQL lưu trữ thông tin này. Hãy tưởng tượng các loại dữ liệu này như những bình đựng đặc biệt được thiết kế riêng cho dữ liệu thời gian.

DATE

Loại dữ liệu DATE lưu trữ ngày theo định dạng YYYY-MM-DD.

CREATE TABLE events (
event_id INT PRIMARY KEY,
event_name VARCHAR(100),
event_date DATE
);

INSERT INTO events (event_id, event_name, event_date)
VALUES (1, 'Chương trình dã ngoại công ty', '2023-07-15');

Trong ví dụ này, chúng ta đang tạo bảng events và thêm một buổi dã ngoại công ty dự kiến vào ngày 15 tháng 7 năm 2023. Loại dữ liệu DATE đảm bảo rằng chúng ta chỉ lưu trữ ngày, không có thông tin giờ nào.

TIME

Loại dữ liệu TIME lưu trữ giờ theo định dạng HH:MI:SS.

CREATE TABLE class_schedule (
class_id INT PRIMARY KEY,
class_name VARCHAR(100),
start_time TIME
);

INSERT INTO class_schedule (class_id, class_name, start_time)
VALUES (1, 'Giới thiệu về SQL', '09:30:00');

Ở đây, chúng ta đang tạo bảng lịch lớp học và thêm một lớp học SQL bắt đầu vào lúc 9:30 sáng. Loại dữ liệu TIME cho phép chúng ta lưu trữ giờ chính xác.

DATETIME

Loại dữ liệu DATETIME kết hợp cả ngày và giờ, thường theo định dạng YYYY-MM-DD HH:MI:SS.

CREATE TABLE appointments (
appointment_id INT PRIMARY KEY,
patient_name VARCHAR(100),
appointment_datetime DATETIME
);

INSERT INTO appointments (appointment_id, patient_name, appointment_datetime)
VALUES (1, 'John Doe', '2023-06-20 14:30:00');

Trong ví dụ này, chúng ta đang lên lịch một cuộc hẹn bác sĩ cho John Doe vào ngày 20 tháng 6 năm 2023, lúc 2:30 chiều. Loại dữ liệu DATETIME cho phép chúng ta lưu trữ cả ngày và giờ trong một cột duy nhất.

TIMESTAMP

Loại dữ liệu TIMESTAMP tương tự như DATETIME, nhưng thường được sử dụng để theo dõi khi nào một bản ghi最后一次 được sửa đổi.

CREATE TABLE blog_posts (
post_id INT PRIMARY KEY,
title VARCHAR(200),
content TEXT,
last_updated TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);

INSERT INTO blog_posts (post_id, title, content)
VALUES (1, 'Bài viết đầu tiên của tôi', 'Xin chào, Thế giới!');

Trong ví dụ này, cột last_updated sẽ tự động được đặt thành ngày và giờ hiện tại khi một bản ghi được chèn hoặc cập nhật.

Chức năng Ngày & Giờ trong SQL

Bây giờ chúng ta đã biết cách lưu trữ ngày và giờ, hãy khám phá một số chức năng kỳ diệu mà SQL cung cấp để manipulates dữ liệu này. Tôi thích nghĩ rằng những chức năng này là những công cụ du hành thời gian trong bộ công cụ SQL của chúng ta!

Ngày và Giờ Hiện tại

Hãy bắt đầu với những điều cơ bản - lấy ngày và giờ hiện tại.

SELECT CURRENT_DATE() AS today,
CURRENT_TIME() AS current_time,
NOW() AS current_datetime;

Truy vấn này sẽ cho bạn biết ngày, giờ và datetime hiện tại. Đó là như hỏi SQL, "Hey, bây giờ là mấy giờ?" Thật hữu ích phải không?

Trích xuất Phần của Ngày

Đôi khi, chúng ta chỉ cần các phần cụ thể của một ngày. SQL cũng có các chức năng cho điều đó!

SELECT YEAR('2023-06-20') AS year,
MONTH('2023-06-20') AS month,
DAY('2023-06-20') AS day,
WEEKDAY('2023-06-20') AS weekday;

Truy vấn này trích xuất năm, tháng, ngày và ngày trong tuần từ ngày cho trước. Đó là như phân tích một ngày để lấy thông tin chúng ta cần.

Toán học với Ngày

SQL cho phép chúng ta thực hiện các phép toán trên ngày. Điều này đặc biệt hữu ích cho việc tính toán khoảng thời gian hoặc tìm ngày tương lai/quá khứ.

SELECT DATE_ADD('2023-06-20', INTERVAL 7 DAY) AS week_later,
DATE_SUB('2023-06-20', INTERVAL 1 MONTH) AS month_ago,
DATEDIFF('2023-12-31', '2023-06-20') AS days_until_new_year;

Trong ví dụ này, chúng ta đang thêm 7 ngày vào một ngày, bớt 1 tháng từ một ngày, và tính toán số ngày giữa hai ngày. Đó là như có một máy thời gian ở trong tầm tay!

Định dạng Ngày

Đôi khi, chúng ta cần trình bày ngày theo một định dạng cụ thể. Chức năng DATE_FORMAT sẽ giúp chúng ta.

SELECT DATE_FORMAT('2023-06-20', '%W, %M %d, %Y') AS formatted_date,
DATE_FORMAT('2023-06-20 14:30:00', '%h:%i %p') AS formatted_time;

Truy vấn này định dạng ngày thành "Tuesday, June 20, 2023" và giờ thành "02:30 PM". Đó là như mặc một chiếc áo vest cho ngày của chúng ta!

Dưới đây là bảng các chỉ định định dạng thường được sử dụng:

Chỉ định Mô tả Ví dụ
%Y Năm 4 chữ số 2023
%y Năm 2 chữ số 23
%M Tên tháng January
%m Tháng (01-12) 01
%d Ngày trong tháng (01-31) 01
%W Tên ngày trong tuần Monday
%w Ngày trong tuần (0-6, 0 là Chủ nhật) 1
%H Giờ (00-23) 13
%h Giờ (01-12) 01
%i Phút (00-59) 30
%s Giây (00-59) 45
%p AM hoặc PM PM

Kết hợp Tất cả

Hãy kết thúc với một ví dụ phức tạp hơn kết hợp nhiều khái niệm:

CREATE TABLE user_logins (
login_id INT PRIMARY KEY AUTO_INCREMENT,
user_id INT,
login_time DATETIME DEFAULT CURRENT_TIMESTAMP
);

INSERT INTO user_logins (user_id) VALUES (1), (2), (3);

SELECT
user_id,
login_time,
DATE_FORMAT(login_time, '%W, %M %d, %Y at %h:%i %p') AS formatted_login_time,
CASE
WHEN WEEKDAY(login_time) IN (5, 6) THEN 'Weekend Login'
ELSE 'Weekday Login'
END AS login_type,
TIMESTAMPDIFF(HOUR, login_time, NOW()) AS hours_since_login
FROM user_logins
WHERE login_time > DATE_SUB(CURRENT_DATE(), INTERVAL 1 WEEK);

Ví dụ này tạo bảng user_logins, chèn một số dữ liệu và sau đó truy vấn nó với các manipulates ngày và giờ khác nhau. Chúng ta đang định dạng thời gian đăng nhập, xác định xem đó là đăng nhập cuối tuần hay ngày thường, và tính toán số giờ đã trôi qua kể từ khi đăng nhập.

Và đó là tất cả, các bạn! Chúng ta đã du hành qua thời gian với SQL, học về các loại dữ liệu ngày và giờ và các hàm manipulates. Nhớ rằng, thực hành là cách tốt nhất để trở thành người thạo, vì vậy đừng ngại thử nghiệm với các khái niệm này. Trước khi bạn biết, bạn sẽ có thể uốn cong thời gian theo ý muốn... ít nhất là trong cơ sở dữ liệu của bạn!

Credits: Image by storyset