Thoạt nhìn, nỗ lực ban đầu của bạn có vẻ khá gần. Tôi giả sử rằng clockDate là một trường DateTime, vì vậy hãy thử điều này:
IF (NOT EXISTS(SELECT * FROM Clock WHERE cast(clockDate as date) = '08/10/2012')
AND userName = 'test')
BEGIN
INSERT INTO Clock(clockDate, userName, breakOut)
VALUES(GetDate(), 'test', GetDate())
END
ELSE
BEGIN
UPDATE Clock
SET breakOut = GetDate()
WHERE Cast(clockDate AS Date) = '08/10/2012' AND userName = 'test'
END
Lưu ý rằng getdate cung cấp cho bạn ngày hiện tại. Nếu bạn đang cố gắng so sánh với một ngày (không có thời gian), bạn cần truyền hoặc yếu tố thời gian sẽ khiến so sánh không thành công.
Nếu clockDate KHÔNG phải là trường datetime (chỉ ngày), thì công cụ SQL sẽ làm việc đó cho bạn - không cần truyền trên câu lệnh set / insert.
IF (NOT EXISTS(SELECT * FROM Clock WHERE clockDate = '08/10/2012')
AND userName = 'test')
BEGIN
INSERT INTO Clock(clockDate, userName, breakOut)
VALUES(GetDate(), 'test', GetDate())
END
ELSE
BEGIN
UPDATE Clock
SET breakOut = GetDate()
WHERE clockDate = '08/10/2012' AND userName = 'test'
END
Như những người khác đã chỉ ra, câu lệnh hợp nhất là một cách khác để giải quyết logic tương tự. Tuy nhiên, trong một số trường hợp, đặc biệt là với các tập dữ liệu lớn, câu lệnh hợp nhất có thể rất chậm, gây ra nhiều hoạt động ghi nhật ký. Vì vậy, biết cách logic nó ra như được hiển thị ở trên vẫn là một kỹ thuật hợp lệ.