มี 2 วิธีหลักในการลบช่วงเวลาจากคอลัมน์ DATETIME หรือ TIMESTAMP ใน MySQL
วิธีที่ 1: DATE_SUB() - ลบช่วงเวลาโดยตรง
SELECT DATE_SUB(yourColumnName, INTERVAL 3 HOUR) FROM yourTableName;
วิธีที่ 2: DATE_ADD() - บวกช่วงเวลาลบ
SELECT DATE_ADD(yourColumnName, INTERVAL -3 HOUR) FROM yourTableName;
ตัวอย่างกับ NOW()
DATE_SUB
mysql> SELECT NOW();
+---------------------+
| now() |
+---------------------+
| 2018-11-30 10:14:12 |
+---------------------+
1 row in set (0.00 sec)
mysql> SELECT DATE_SUB(NOW(), INTERVAL 3 HOUR);
+---------------------------------+
| date_sub(now(), interval 3 hour) |
+---------------------------------+
| 2018-11-30 07:14:25 |
+---------------------------------+
1 row in set (0.00 sec)
DATE_ADD (Interval ติดลบ)
mysql> SELECT NOW();
+---------------------+
| now() |
+---------------------+
| 2018-11-30 10:13:23 |
+---------------------+
1 row in set (0.00 sec)
mysql> SELECT DATE_ADD(NOW(), INTERVAL -3 HOUR);
+----------------------------------+
| date_add(now(), interval -3 hour) |
+----------------------------------+
| 2018-11-30 07:13:28 |
+----------------------------------+
1 row in set (0.00 sec)
รูปแบบ INTERVAL ที่รองรับ
| หน่วย | ตัวอย่าง |
MICROSECOND | INTERVAL 500 MICROSECOND |
SECOND | INTERVAL 30 SECOND |
MINUTE | INTERVAL 45 MINUTE |
HOUR | INTERVAL 3 HOUR |
DAY | INTERVAL 7 DAY |
WEEK | INTERVAL 2 WEEK |
MONTH | INTERVAL 1 MONTH |
QUARTER | INTERVAL 1 QUARTER |
YEAR | INTERVAL 1 YEAR |
SECOND_MICROSECOND | INTERVAL '30.5' SECOND_MICROSECOND |
MINUTE_MICROSECOND | INTERVAL '45.5' MINUTE_MICROSECOND |
MINUTE_SECOND | INTERVAL '45:30' MINUTE_SECOND |
HOUR_MICROSECOND | INTERVAL '3:30.5' HOUR_MICROSECOND |
HOUR_SECOND | INTERVAL '3:45:30' HOUR_SECOND |
HOUR_MINUTE | INTERVAL '3:45' HOUR_MINUTE |
DAY_MICROSECOND | INTERVAL '1 12:30:30.5' DAY_MICROSECOND |
DAY_SECOND | INTERVAL '1 12:30:30' DAY_SECOND |
DAY_MINUTE | INTERVAL '1 12:30' DAY_MINUTE |
DAY_HOUR | INTERVAL '1 12' DAY_HOUR |
YEAR_MONTH | INTERVAL '1-6' YEAR_MONTH |
ใช้กับคอลัมน์ตาราง
-- ลบ 3 ชั่วโมงจากคอลัมน์ created_at
SELECT id, created_at, DATE_SUB(created_at, INTERVAL 3 HOUR) AS three_hours_ago
FROM logs;
UPDATE ลบ 3 ชั่วโมงจริงในตาราง
UPDATE appointments
SET appointment_time = DATE_SUB(appointment_time, INTERVAL 3 HOUR)
WHERE timezone = 'UTC' AND needs_adjustment = 1;
DATE_SUB vs DATE_ADD
| ด้าน | DATE_SUB | DATE_ADD (Negative) |
| ความอ่านง่าย | ชัดเจนกว่า (Semantic) | อาจสับสน |
| ประสิทธิภาพ | เหมือนกัน | เหมือนกัน |
| แนะนำ | ✅ ใช้ DATE_SUB สำหรับการลบ | ใช้เมื่อคำนวณ Dynamic |