Na první pohled se váš původní pokus zdá docela blízko. Předpokládám, že clockDate je pole DateTime, takže zkuste toto:
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
Všimněte si, že getdate vám dává aktuální datum. Pokud se pokoušíte porovnat s datem (bez času), musíte přetypovat, nebo prvek času způsobí, že porovnání selže.
Pokud clockDate NENÍ pole datetime (pouze datum), pak to SQL engine udělá za vás – není třeba předávat příkaz 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 již poukázali jiní, příkaz merge je dalším způsobem, jak se vypořádat se stejnou logikou. V některých případech, zejména u velkých datových sad, však může být příkaz merge neúnosně pomalý, což způsobuje mnoho aktivity trans logu. Takže vědět, jak to vyložit, jak je uvedeno výše, je stále platná technika.