Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> MySQL

เพิ่มค่า Timestamp หลายแถวพร้อมกันด้วย User Variable และ INTERVAL ใน MySQL

ภาพรวม

ใช้ 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 ที่รองรับ

หน่วยตัวอย่าง
MICROSECONDINTERVAL @us MICROSECOND
SECONDINTERVAL @sec SECOND
MINUTEINTERVAL @min MINUTE
HOURINTERVAL @hr HOUR
DAYINTERVAL @day DAY
WEEKINTERVAL @wk WEEK
MONTHINTERVAL @mo MONTH
QUARTERINTERVAL @q QUARTER
YEARINTERVAL @yr YEAR
COMBINEDINTERVAL '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 - เพิ่มเกินจะ Error
  • DATETIME ช่วงกว้างกว่า (1000-9999) - ปลอดภัยกว่าสำหรับการคำนวณ
  • User Variable (@var) คงค่าใน Session เดียวกัน
  • การ UPDATE หลายแถว ใช้ Table Lock (ขึ้นกับ Engine/Isolation Level)

สรุป

ใช้ SET @var := value; UPDATE ... SET ts = ts + INTERVAL @var UNIT เพื่อเพิ่ม/ลดเวลาให้หลายแถวพร้อมกันอย่างมีประสิทธิภาพ