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

การใช้ NOW() และ SYSDATE() ในคำสั่ง UPDATE datetime ใน MySQL

พฤติกรรมของ 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() จะให้ผลลัพธ์เวลาเดียวกันสำหรับทุกแถวที่อัปเดต