Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> MySQL

Cách cộng ngày vào ngày tháng trong MySQL (DATE_ADD)


Cú pháp

Sử dụng hàm DATE_ADD() với INTERVAL:

DATE_ADD(ngay_goc, INTERVAL so_luong DON_VI)

Ví dụ: Thêm ngày vào datetime/date

1. Tạo bảng

mysql> CREATE TABLE addingDaysDemo ( 
-> yourDateTime DATETIME 
-> ); 
Query OK, 0 rows affected (1.09 sec)

2. Chèn dữ liệu với NOW() và CURDATE()

mysql> INSERT INTO addingDaysDemo VALUES(DATE_ADD(NOW(), INTERVAL 1 DAY)); 
Query OK, 1 row affected (0.14 sec) 
mysql> INSERT INTO addingDaysDemo VALUES(DATE_ADD(NOW(), INTERVAL 4 DAY)); 
Query OK, 1 row affected (0.17 sec) 
mysql> INSERT INTO addingDaysDemo VALUES(DATE_ADD(NOW(), INTERVAL 5 DAY)); 
Query OK, 1 row affected (0.14 sec) 
mysql> INSERT INTO addingDaysDemo VALUES(DATE_ADD(NOW(), INTERVAL 7 DAY)); 
Query OK, 1 row affected (0.17 sec) 
mysql> INSERT INTO addingDaysDemo VALUES(DATE_ADD(NOW(), INTERVAL 9 DAY)); 
Query OK, 1 row affected (0.15 sec) 

mysql> INSERT INTO addingDaysDemo VALUES(DATE_ADD(CURDATE(), INTERVAL 1 DAY)); 
Query OK, 1 row affected (0.18 sec) 
mysql> INSERT INTO addingDaysDemo VALUES(DATE_ADD(CURDATE(), INTERVAL 4 DAY)); 
Query OK, 1 row affected (0.16 sec) 
mysql> INSERT INTO addingDaysDemo VALUES(DATE_ADD(CURDATE(), INTERVAL 5 DAY)); 
Query OK, 1 row affected (0.17 sec) 
mysql> INSERT INTO addingDaysDemo VALUES(DATE_ADD(CURDATE(), INTERVAL 7 DAY)); 
Query OK, 1 row affected (0.12 sec) 
mysql> INSERT INTO addingDaysDemo VALUES(DATE_ADD(CURDATE(), INTERVAL 9 DAY)); 
Query OK, 1 row affected (0.15 sec)

3. Kết quả (NOW() có giờ, CURDATE() giờ = 00:00:00)

mysql> SELECT * FROM addingDaysDemo;
+---------------------+ 
| yourDateTime        | 
+---------------------+ 
| 2018-12-14 15:36:57 | 
| 2018-12-17 15:37:06 | 
| 2018-12-18 15:37:12 | 
| 2018-12-20 15:37:17 | 
| 2018-12-22 15:37:21 | 
| 2018-12-14 00:00:00 | 
| 2018-12-17 00:00:00 | 
| 2018-12-18 00:00:00 | 
| 2018-12-20 00:00:00 | 
| 2018-12-22 00:00:00 | 
+---------------------+ 
10 rows in set (0.00 sec)

Các đơn vị INTERVAL đầy đủ

Đơn vịVí dụMô tả
MICROSECONDINTERVAL 500 MICROSECONDMicro giây
SECONDINTERVAL 30 SECONDGiây
MINUTEINTERVAL 45 MINUTEPhút
HOURINTERVAL 2 HOURGiờ
DAYINTERVAL 7 DAYNgày
WEEKINTERVAL 1 WEEKTuần
MONTHINTERVAL 3 MONTHTháng
QUARTERINTERVAL 2 QUARTERQuý (3 tháng)
YEARINTERVAL 1 YEARNăm
DAY_HOURINTERVAL '1 12' DAY_HOUR1 ngày 12 giờ
DAY_MINUTEINTERVAL '1 12:30' DAY_MINUTE1 ngày 12h30
DAY_SECONDINTERVAL '1 12:30:45' DAY_SECOND1 ngày 12h30m45s

Trừ ngày (DATE_SUB)

-- Trừ 10 ngày
SELECT DATE_SUB(NOW(), INTERVAL 10 DAY);

-- Hoặc dùng âm với DATE_ADD
SELECT DATE_ADD(NOW(), INTERVAL -10 DAY);

Ứng dụng thực tế

Tính hạn thanh toán (Due date = Created + 30 ngày)

SELECT 
    invoice_id,
    created_at,
    DATE_ADD(created_at, INTERVAL 30 DAY) AS due_date
FROM invoices;

Lọc bản ghi trong 7 ngày qua

SELECT * FROM orders 
WHERE created_at >= DATE_SUB(NOW(), INTERVAL 7 DAY);

Tính ngày sinh nhật năm nay

SELECT 
    name,
    DATE_ADD(birthdate, INTERVAL (YEAR(CURDATE()) - YEAR(birthdate)) YEAR) AS birthday_this_year
FROM users;

Lưu ý

  • NOW() = DATE + TIME (thời điểm thực thi)
  • CURDATE() = chỉ DATE (giờ = 00:00:00)
  • MySQL tự xử lý ngày cuối tháng, năm nhuận
  • Index trên cột DATE/DATETIME tăng tốc WHERE với DATE_ADD/SUB