À première vue, votre tentative initiale semble assez proche. Je suppose que clockDate est un champ DateTime, alors essayez ceci :
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
Notez que getdate vous donne la date actuelle. Si vous essayez de comparer à une date (sans l'heure), vous devez lancer ou l'élément de temps entraînera l'échec de la comparaison.
Si clockDate n'est PAS un champ datetime (juste la date), alors le moteur SQL le fera pour vous - pas besoin de caster une instruction 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
Comme d'autres l'ont souligné, l'instruction de fusion est une autre façon d'aborder cette même logique. Cependant, dans certains cas, en particulier avec des ensembles de données volumineux, l'instruction de fusion peut être extrêmement lente, ce qui entraîne une activité importante dans le journal des transactions. Donc, savoir comment le logiquer comme indiqué ci-dessus est toujours une technique valable.