一見、あなたの最初の試みはかなり近いように見えます。 clockDateはDateTimeフィールドであると想定しているので、これを試してください:
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
getdateは現在の日付を提供することに注意してください。 (時刻なしの)日付と比較しようとしている場合は、キャストする必要があります。そうしないと、time要素によって比較が失敗します。
clockDateが日時フィールドではない(日付のみ)場合は、SQLエンジンが自動的に行います。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
他の人が指摘しているように、mergeステートメントはこれと同じロジックに取り組むもう1つの方法です。ただし、場合によっては、特に大規模なデータセットの場合、マージステートメントが非常に遅くなり、大量のトランザクションログアクティビティが発生する可能性があります。したがって、上記のように論理化する方法を知ることは、依然として有効な手法です。