Na pierwszy rzut oka twoja pierwotna próba wydaje się całkiem bliska. Zakładam, że clockDate to pola DateTime, więc spróbuj tego:
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
Zauważ, że getdate podaje aktualną datę. Jeśli próbujesz porównać z datą (bez czasu), musisz rzucić lub element czasu spowoduje niepowodzenie porównania.
Jeśli clockDate NIE jest polem datetime (tylko data), to silnik SQL zrobi to za Ciebie - nie ma potrzeby rzutowania na instrukcję 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
Jak zauważyli inni, oświadczenie scalające jest kolejnym sposobem rozwiązania tej samej logiki. Jednak w niektórych przypadkach, szczególnie w przypadku dużych zestawów danych, instrukcja merge może być zbyt powolna, powodując dużą aktywność dziennika transakcji. Tak więc wiedza o tym, jak to wylogować, jak pokazano powyżej, jest nadal poprawną techniką.