À primeira vista, sua tentativa original parece bem próxima. Estou assumindo que clockDate é um campo DateTime, então tente isto:
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
Observe que getdate fornece a data atual. Se você estiver tentando comparar com uma data (sem a hora), precisará converter ou o elemento time fará com que a comparação falhe.
Se clockDate NÃO for um campo de data e hora (apenas data), o mecanismo SQL fará isso por você - não há necessidade de converter em uma instrução 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
Como outros apontaram, a instrução merge é outra maneira de lidar com essa mesma lógica. No entanto, em alguns casos, especialmente com grandes conjuntos de dados, a instrução de mesclagem pode ser proibitivamente lenta, causando muita atividade de log de transferência. Portanto, saber como raciocinar como mostrado acima ainda é uma técnica válida.