พฤติกรรมของ NOW() และ SYSDATE() เมื่อใช้ใน UPDATE หลายแถว
คำถามที่พบบ่อย: เมื่อรัน UPDATE ... SET datetime = NOW() แล้ว ทุกแถวที่อัปเดตจะมีค่า datetime เหมือนกันหรือไม่?
คำตอบสั้น: ใช่ ทุกแถวจะได้ค่า datetime เหมือนกัน
NOW() คืนค่าเวลาที่คงที่ (constant) ตั้งแต่ต้นการรันคำสั่ง (statement) ไม่ว่าจะอัปเดตกี่แถว ก็จะได้เวลาเดียวกัน
SYSDATE() คืนค่าเวลาจริง ณ จุดที่ฟังก์ชันถูกเรียกใช้งาน (ตั้งแต่ MySQL 5.0.13) แต่ในคำสั่ง UPDATE แบบเดียว ก็จะได้เวลาเดียวกันเช่นกัน เพราะทำงานภายในคำสั่งเดียวกัน
ตัวอย่างสาธิต
สร้างตาราง NowDemo:
CREATE TABLE NowDemo (
DueDateTime DATETIME
);
เพิ่มข้อมูล:
INSERT INTO NowDemo VALUES
('2018-12-19'),
('2018-11-10'),
('2017-11-21');
กรณีที่ 1: ใช้ NOW()
UPDATE NowDemo SET DueDateTime = NOW();
ผลลัพธ์ - ทุกแถวมีเวลาเดียวกัน:
| DueDateTime |
|---|
| 2018-12-20 16:10:00 |
| 2018-12-20 16:10:00 |
| 2018-12-20 16:10:00 |
กรณีที่ 2: ใช้ SYSDATE()
UPDATE NowDemo SET DueDateTime = SYSDATE();
ผลลัพธ์ - ทุกแถวยังคงมีเวลาเดียวกัน (เพราะอยู่ในคำสั่งเดียว):
| DueDateTime |
|---|
| 2018-12-20 16:10:35 |
| 2018-12-20 16:10:35 |
| 2018-12-20 16:10:35 |
เมื่อใดที่ SYSDATE() จะให้ค่าต่างกัน?
เฉพาะเมื่อใช้ใน Trigger หรือ Stored Procedure ที่มีหลายคำสั่งหรือมีการหน่วงเวลา SYSDATE() จะคืนค่าเวลาจริง ณ จุดนั้นๆ ในขณะที่ NOW() ยังคงคืนค่าเวลาเริ่มต้นของคำสั่ง/โปรแกรม
สรุป: ในคำสั่ง UPDATE เดียว ทั้ง NOW() และ SYSDATE() จะให้ผลลัพธ์เวลาเดียวกันสำหรับทุกแถวที่อัปเดต