Vid första anblicken verkar ditt ursprungliga försök ganska nära. Jag antar att clockDate är ett DateTime-fält så prova detta:
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
Observera att getdate ger dig det aktuella datumet. Om du försöker jämföra med ett datum (utan tiden) måste du kasta, annars kommer tidselementet att göra att jämförelsen misslyckas.
Om clockDate INTE är datetime-fältet (bara datum), kommer SQL-motorn att göra det åt dig - du behöver inte använda en set/insert-sats.
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
Som andra har påpekat är sammanslagningsförklaringen ett annat sätt att tackla samma logik. Men i vissa fall, särskilt med stora datamängder, kan sammanslagningssatsen vara oöverkomligt långsam, vilket orsakar mycket tranloggaktivitet. Så att veta hur man loggar ut det som visas ovan är fortfarande en giltig teknik.