ภาพรวม
ใช้ User-Defined Variable (@variable) เก็บค่าเพิ่ม (Increment) แล้วนำไปใช้ใน UPDATE ... SET col = col + INTERVAL @var SECOND เพื่อเพิ่มเวลาให้หลายแถวพร้อมกัน
ไวยากรณ์
SET @var_name := increment_value;
UPDATE table_name
SET timestamp_col = timestamp_col + INTERVAL @var_name SECOND;
ตัวอย่างสมบูรณ์
1. สร้างตารางและข้อมูล
CREATE TABLE DemoTable (DueDatetime TIMESTAMP);
INSERT INTO DemoTable VALUES ('2019-01-31 12:30:40');
INSERT INTO DemoTable VALUES ('2019-09-06 10:00:00');
INSERT INTO DemoTable VALUES ('2019-09-07 11:10:24');
2. ข้อมูลก่อนอัปเดต
SELECT * FROM DemoTable;
+---------------------+
| DueDatetime |
+---------------------+
| 2019-01-31 12:30:40 |
| 2019-09-06 10:00:00 |
| 2019-09-07 11:10:24 |
+---------------------+
3. ตั้งค่า Variable และ Update
SET @secondValue := 12;
UPDATE DemoTable
SET DueDatetime = DueDatetime + INTERVAL @secondValue SECOND;
4. ผลลัพธ์ (เพิ่ม 12 วินาที ทุกแถว)
SELECT * FROM DemoTable;
+---------------------+
| DueDatetime |
+---------------------+
| 2019-01-31 12:30:52 |
| 2019-09-06 10:00:12 |
| 2019-09-07 11:10:36 |
+---------------------+
หน่วย INTERVAL ที่รองรับ
| หน่วย | ตัวอย่าง |
|---|---|
| MICROSECOND | INTERVAL @us MICROSECOND |
| SECOND | INTERVAL @sec SECOND |
| MINUTE | INTERVAL @min MINUTE |
| HOUR | INTERVAL @hr HOUR |
| DAY | INTERVAL @day DAY |
| WEEK | INTERVAL @wk WEEK |
| MONTH | INTERVAL @mo MONTH |
| QUARTER | INTERVAL @q QUARTER |
| YEAR | INTERVAL @yr YEAR |
| COMBINED | INTERVAL '1 12:30:05' DAY_SECOND |
การเพิ่มค่าต่างกันต่อแถว (Per-row Increment)
-- ใช้คอลัมน์อื่นเป็นตัวคูณ
UPDATE DemoTable
SET DueDatetime = DueDatetime + INTERVAL (Id * 10) SECOND;
-- หรือใช้ CASE
UPDATE DemoTable
SET DueDatetime = DueDatetime + INTERVAL
CASE
WHEN Id = 1 THEN 10
WHEN Id = 2 THEN 20
ELSE 30
END SECOND;
ข้อควรระวัง
TIMESTAMPช่วง 1970-2038 - เพิ่มเกินจะ ErrorDATETIMEช่วงกว้างกว่า (1000-9999) - ปลอดภัยกว่าสำหรับการคำนวณ- User Variable (@var) คงค่าใน Session เดียวกัน
- การ UPDATE หลายแถว ใช้ Table Lock (ขึ้นกับ Engine/Isolation Level)
สรุป
ใช้ SET @var := value; UPDATE ... SET ts = ts + INTERVAL @var UNIT เพื่อเพิ่ม/ลดเวลาให้หลายแถวพร้อมกันอย่างมีประสิทธิภาพ