На пръв поглед първоначалният ви опит изглежда доста близък. Предполагам, че clockDate е поле DateTime, така че опитайте това:
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
Имайте предвид, че getdate ви дава текущата дата. Ако се опитвате да сравните с дата (без час), трябва да направите кастинг или времевият елемент ще доведе до неуспех на сравнението.
Ако clockDate НЕ е поле за дата и час (само дата), тогава SQL машината ще го направи вместо вас - няма нужда да прехвърляте оператор 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
Както други посочиха, изявлението за сливане е друг начин за справяне със същата тази логика. Въпреки това, в някои случаи, особено при големи набори от данни, операторът за сливане може да бъде непосилно бавен, причинявайки много активност в журнала за преобразуване. Така че знанието как да го логически изведете, както е показано по-горе, все още е валидна техника.