पहली नज़र में आपका मूल प्रयास बहुत करीब लगता है। मैं मान रहा हूँ कि क्लॉकडेट एक डेटटाइम फ़ील्ड है इसलिए इसे आज़माएँ:
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 आपको वर्तमान दिनांक देता है। यदि आप किसी तिथि (बिना समय के) की तुलना करने का प्रयास कर रहे हैं, तो आपको कास्ट करने की आवश्यकता है या समय तत्व तुलना को विफल कर देगा।
यदि क्लॉकडेट डेटाटाइम फ़ील्ड नहीं है (बस दिनांक), तो SQL इंजन आपके लिए यह करेगा - सेट/सम्मिलित विवरण पर डालने की कोई आवश्यकता नहीं है।
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
जैसा कि अन्य ने बताया है, मर्ज स्टेटमेंट इसी तर्क से निपटने का एक और तरीका है। हालांकि, कुछ मामलों में, विशेष रूप से बड़े डेटा सेट के साथ, मर्ज स्टेटमेंट निषेधात्मक रूप से धीमा हो सकता है, जिससे बहुत अधिक ट्रान लॉग गतिविधि हो सकती है। इसलिए यह जानना कि इसे कैसे तर्क करना है, जैसा कि ऊपर दिखाया गया है, अभी भी एक मान्य तकनीक है।