2012-04-19 19 views
8

मैं SQL सर्वर के लिए नौसिखिया हूं। कृपया एक प्रश्न में निम्नलिखित तर्क लिखने में मेरी सहायता करें।यदि SQL क्वेरी में स्थिति

If getnow() > today 4 PM 
Then 
    SELECT * 
    FROM table 
    WHERE MailDate is Tomorrow 
Else 
    SELECT * 
    FROM table 
    WHERE MailDate is Today 

उत्तर

6
select * 
from table 
where DATEDIFF(day, GETDATE(), maildate) = case when 
    DATEPART(hour, GETDATE()) >= 16 then 1 else 0 
end 
+2

अरे RobIII, दोस्त। बस कहना चाहता था, मैंने आपको उकसाया था, लेकिन डाउनवॉट्स इस पोस्ट में वार्तालापों का परिणाम हो सकता है। इसे व्यक्तिगत रूप से न लें, हम सब कुछ हमेशा सीख सकते हैं :) बस इसे लिखने के बारे में सोचना याद रखें क्योंकि आप इसे पोस्ट करते हैं और विचार करते हैं कि यह दूसरों के सामने कैसे आ सकता है। मैं और अन्य यहां SO को एक दोस्ताना समुदाय बनाने के लिए कड़ी मेहनत करते हैं जो सभी कौशल स्तरों का स्वागत करता है और हर किसी को मौका देता है। ऐसा लगता है कि तुम्हारा जवाब भी उत्तर के रूप में चिह्नित किया गया है, इसलिए बधाई हो, और एक अच्छा दिन हो! – mellamokb

+0

रोबेल, मैंने आपको ऊपर उठाया और यदि यह आपको बेहतर महसूस करता है, तो मैं यह कहना चाहूंगा कि मैंने आपका कोड लागू किया क्योंकि यह बहुत कुशल दिखता था। बेशक इसे समझने में थोड़ी देर लग गई। :) बहुत बहुत धन्यवाद – user1345260

0
IF (DATEDIFF(h, GETDATE(), DATEADD(h,4,GETDATE()))>0) 

SELECT * 
FROM table 
WHERE MailDate is Tomorrow 

ELSE 

SELECT * 
FROM table 
WHERE MailDate is Today 

यह दस्तावेज़ों पर एक नज़र डालें। यह एमएस एसक्यूएल है। यदि आप और अधिक करना चाहते हैं तो बस एक कमांड/अगर आप BEGIN करते हैं तो अंदर चुनें .... अंत।

+0

कब से MSSQL समर्थन 'कहां MailDate Tomorrow' या' कहां MailDate है करता है Today'? साथ ही, ['is'] (http://msdn.microsoft.com/en-us/library/aa933227 (v = sql.80) .aspx) ऑपरेटर का उद्देश्य 'शून्य' की तुलना करने के लिए है, और कुछ भी नहीं। – RobIII

+0

@RobIII मैंने बस दो कथन की प्रतिलिपि बनाई, उसे नहीं देखा। वैसे भी वह आपको वही सरल बना सकता है जिसे मैंने खंड में लिखा था, यह वही – YvesR

3
IF datepart(hh, getdate()) >= 16 
    BEGIN 
     SELECT * 
     FROM table 
     WHERE DateDiff(day, getdate(), MailDate) = 1 
    END 
ELSE 
    BEGIN 
     SELECT * 
     FROM table 
     WHERE DateDiff(day, getdate(), MailDate) = 0 
    END 
+1

क्यों बदसूरत कास्टिंग बैक-एंड-आउट ("जादू [शैली-निरंतर] (http://msdn.microsoft.com/ en-us/library/aa226054 (v = sql.80) .aspx) "(उदाहरण के लिए' 101') कोड कोई भी कभी याद नहीं रख सकता है, वर्चर्स, स्ट्रिंग में एक समय-सारणी जिसमें एक स्थान शामिल है, अगर भूल गया है, तो सब कुछ तोड़ देगा।) यदि डेटाटाइम फ़ंक्शन हैं? – RobIII

+0

@RobIII आप सही हैं यह तय है। मैं बस ऐसा करने का एक और तरीका प्रदान कर रहा था लेकिन मैंने यह नहीं कहा कि यह सबसे अच्छा तरीका था। – Taryn

+1

मैंने अपना जवाब हटा दिया है क्योंकि वे अब अनिवार्य रूप से वही हैं। लेकिन मैं यहां डेमो पोस्ट करूंगा: http://www.sqlfiddle.com/#!3/96767/1। ध्यान दें कि आप '> = 16' चाहते हैं अन्यथा आप 5 बजे से शुरू कर रहे हैं। – mellamokb

0
IF DATEPART(HOUR, GETDATE()) > 16 
BEGIN 
    -- SELECT statement 
END 
ELSE 
BEGIN 
    -- SELECT statement 
END 

यह एक संग्रहीत प्रक्रिया में होने की जरूरत नहीं है।

+3

हर किसी के जवाब पर टिप्पणी करना और खुद को बढ़ावा देना बहुत उपयोगी या सामुदायिक उन्मुख नहीं है। भविष्य में इसे करने से बचें। – mellamokb

+0

बहुत मजेदार, जंगली प्लेसर। और धन्यवाद, @mellamokb। – BoltClock

1

मुझे सटीक एमएस-सिंटैक्स-बोली नहीं पता है, लेकिन मैं साबित करने की कोशिश करूंगा कि आपको आईएफ या केस निर्माण की आवश्यकता नहीं है। मैंने एक उदाहरण के रूप में @mellamokb का जवाब लिया।

SELECT * 
    FROM the_table 
WHERE (DATEPART(hour, GETDATE()) >= 16 
      AND DATEDIFF(day, GETDATE(), MailDate) = 1) 
    OR (DATEPART(hour, GETDATE()) < 16 
      AND DATEDIFF(day, GETDATE(), MailDate) = 0) 
    ; 
+0

सिवाय इसके कि आपकी "'किसी मामले से बचने के लिए खोज'/अन्य 'परिणाम' जहां क्लॉज 'में परिणाम होता है जिसके लिए प्रत्येक रिकॉर्ड के लिए कई मूल्यांकन किए जाने की आवश्यकता होती है जबकि मेरा' मामला ... 'का मूल्यांकन किया जा सकता है और फिर केवल जरूरतों को प्रति रिकॉर्ड एक मूल्यांकन। – RobIII

1

विचार यहाँ निहितार्थ पुनर्लेखन नियम का उपयोग करने के लिए है:

(NOT (DATEPART(HOUR, CURRENT_TIMESTAMP) >= 16) 
    OR (DATEDIFF(DAY, CURRENT_TIMESTAMP, MailDate) = 1)) 

करने के लिए अपने मामले में

IF (x) THEN (y) is equivalent to (NOT (x) OR y) 

IF (DATEPART(HOUR, CURRENT_TIMESTAMP) >= 16) 
    THEN (DATEDIFF(DAY, CURRENT_TIMESTAMP, MailDate) = 1) 

बराबर है और खुद के बराबर है

((DATEPART(HOUR, CURRENT_TIMESTAMP) < 16) 
    OR (DATEDIFF(DAY, CURRENT_TIMESTAMP, MailDate) = 1)) 

को फिर से लिखकर अपने आप में एक IF..THEN बयान के रूप में मूल ELSE खंड:

IF (DATEPART(HOUR, CURRENT_TIMESTAMP) < 16) 
    THEN (DATEDIFF(DAY, CURRENT_TIMESTAMP, MailDate) = 0) 

(इस समय मध्यवर्ती चरण omiting)

((DATEPART(HOUR, CURRENT_TIMESTAMP) >= 16) 
    OR (DATEDIFF(DAY, CURRENT_TIMESTAMP, MailDate) = 0)) 

दो अभिव्यक्ति के बराबर है इसके बाद संयोजन सामान्य रूप में लिखना ("AND एस की श्रृंखला)

SELECT * 
    FROM the_table 
WHERE ((DATEPART(HOUR, CURRENT_TIMESTAMP) < 16) 
      OR (DATEDIFF(DAY, CURRENT_TIMESTAMP, MailDate) = 1)) 
     AND 
     (((DATEPART(HOUR, CURRENT_TIMESTAMP) >= 16 
      OR (DATEDIFF(DAY, CURRENT_TIMESTAMP, MailDate) = 0)) ; 
1

चयन a.name, अगर (a.is_active = 'टी', 'सक्रिय', 'निष्क्रिय') mytable से एक