Tìm kiếm các sự kiện trong 30 ngày qua
Một tác vụ phổ biến khác là tìm kiếm các hàng thuộc phạm vi ngày cụ thể. Về nguyên tắc, điều này không khó nếu ngày bắt đầu và ngày kết thúc của phạm vi là cố định: SQL có thể so sánh ngày cũng như so sánh số.
Các toán tử so sánh có thể được áp dụng cho ngày tháng: < , > , <= , v.v. Ngoài ra, có một toán tử BETWEEN đặc biệt cũng có thể hoạt động với ngày tháng. Ví dụ: hãy viết một truy vấn sẽ chọn tất cả các nhiệm vụ từ bảng nhiệm vụ cần hoàn thành vào mùa hè năm 2022. Yêu cầu sẽ trông như thế này:
SELECT * FROM task
WHERE task.deadline BETWEEN '2022-06-01' AND '2022-08-31'
Kết quả của truy vấn này sẽ là:
nhận dạng | nhân viên_id | tên | thời hạn |
---|---|---|---|
1 | 1 | Sửa lỗi ở frontend | 2022-06-01 |
2 | 2 | Sửa lỗi trên backend | 2022-06-15 |
3 | 5 | Mua cà phê | 2022-07-01 |
4 | 5 | Mua cà phê | 2022-08-01 |
Nhưng phải viết gì trong yêu cầu nếu chúng tôi muốn nhận nhiệm vụ, chẳng hạn như trong 30 ngày qua. Trong đó 30 ngày qua được liên kết trực tiếp với thời gian thực hiện truy vấn. Nghĩa là, nếu truy vấn được thực hiện vào ngày 25 tháng 7, thì bạn cần chọn ngày từ 25 tháng 6 đến 24 tháng 7. Làm cách nào để liên kết phạm vi ngày với thời gian hiện tại?
Để làm điều này, hãy sử dụng chức năng thêm ngày:
DATE_ADD (date, INTERVAL expression units)
Tôi nghĩ sẽ dễ giải thích hơn với một vài ví dụ:
# | Lời yêu cầu | Kết quả |
---|---|---|
1 | DATE_ADD('2022-06-04', THỜI GIAN 5 NGÀY) | 2022-06-09 |
2 | DATE_ADD('2022-06-04', THỜI GIAN 4 TUẦN) | 2022-07-02 |
3 | DATE_ADD('2022-06-04', THỜI GIAN 2 THÁNG) | 2022-08-04 |
4 | ||
5 | DATE_SUB('2022-06-04', THỜI GIAN 5 NGÀY) | 2022-05-30 |
6 | DATE_SUB('2022-06-04', THỜI GIAN 4 TUẦN) | 2022-05-07 |
7 | DATE_SUB('2022-06-04', THỜI GIAN 2 THÁNG) | 2022-04-04 |
Nhân tiện, một số ngày, tuần, tháng và năm nhất định cũng có thể được trừ vào một ngày nhất định.
Và nếu chúng tôi quay lại yêu cầu của mình - để lấy dữ liệu trong 30 ngày qua, thì chúng tôi cần hai ngày trong phạm vi này:
- CURDATE() - kết thúc phạm vi
- DATE_SUB(CURDATE() , INTERVAL 30 DAY) - bắt đầu phạm vi
Yêu cầu sẽ trông như thế này:
SELECT * FROM task WHERE task.deadline
BETWEEN DATE_SUB( CURDATE() , INTERVAL 30 DAY) AND CURDATE()
Kết quả của truy vấn này sẽ như thế này (Tôi có ngày hôm nay 4 tháng 6 năm 2022):
nhận dạng | nhân viên_id | tên | thời hạn |
---|---|---|---|
1 | 1 | Sửa lỗi ở frontend | 2022-06-01 |
Cách tìm sự khác biệt giữa hai ngày
Và một tính năng hữu ích khác. Đôi khi bạn có thể cần tính toán sự khác biệt giữa hai ngày theo ngày. Để làm điều này, SQL có một chức năng đặc biệt - DATEDIFF().
Nó rất dễ dàng để làm việc với cô ấy:
DATEDIFF (date 1, date 2)
Ngày thứ hai chỉ đơn giản là trừ ngày đầu tiên. Nếu date2 đến sau date1, thì kết quả sẽ là số âm.
Nhân tiện, chúng ta có thể viết lại truy vấn trước đó bằng cách sử dụng hàm DATEDIFF(). Chúng ta cần chọn tất cả các nhiệm vụ từ bảng nhiệm vụ có thời hạn khác với ngày hiện tại không quá 30 ngày. Đây là yêu cầu đó sẽ như thế nào:
SELECT * FROM task WHERE DATEDIFF(task.deadline, CURDATE() ) < 30
Kết quả của truy vấn này sẽ như thế này (Tôi có ngày hôm nay 4 tháng 6 năm 2022):
nhận dạng | nhân viên_id | tên | thời hạn |
---|---|---|---|
1 | 1 | Sửa lỗi ở frontend | 2022-06-01 |
2 | 2 | Sửa lỗi trên backend | 2022-06-15 |
3 | 5 | Mua cà phê | 2022-07-01 |
Lần này, SQL đã tìm thấy tới ba hàng. Hãy suy nghĩ về lý do tại sao lần trước có một dòng và lần này có ba dòng?