2012-04-19 55 views
8

我是SQL Server的新手。請幫助我在查詢中編寫以下邏輯。如果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,哥們。只是想說,我確實鼓勵了你,但降價可能是這篇文章中對話的結果。不要個人承擔,我們都可以總是學到一些東西:)只要記住想想你在發佈的內容時所說的內容,並考慮如何將其發佈給其他人。我和這裏的其他人努力使這個友好的社區歡迎所有技能水平並給每個人一個機會。它看起來像你的標記也是答案,所以恭喜,祝你有美好的一天! – mellamokb 2012-04-20 00:08:29

+0

Roblll, 我向你致敬,如果它讓你感覺更好,我想說我實現了你的代碼,因爲它看起來非常有效。當然,我理解它需要一段時間。 :)非常感謝 – user1345260 2012-04-20 00:10:09

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 

這是MS SQL。如果你想做更多的話,那麼只需要一個命令/選擇,如果你做BEGIN .... END。

+0

時候起支撐MSSQL'WHERE MAILDATE是Tomorrow'或'WHERE MAILDATE是Today'?此外,['is'](http://msdn.microsoft.com/en-us/library/aa933227(v = sql.80).aspx)運算符旨在與'null'進行比較,沒有別的。 – RobIII 2012-04-19 23:09:30

+0

@RobIII我剛剛複製了兩條語句,沒有看到。無論如何,他可以簡單的你,我寫在if條款相同,它只是相同的 – YvesR 2012-04-19 23:48:10

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')代碼,任何人都不會記住,varchars是一個字符串中的一個時間值,包括一個空格,如果忘記了,它會打破所有內容。 )如果有日期時間功能? – RobIII 2012-04-19 23:14:21

+0

@RobIII你是對的,它是固定的。我只是提供了另一種方式來做到這一點,但我沒有說這是最好的方式。 – Taryn 2012-04-19 23:16:07

+1

我已經刪除了我的答案,因爲它們現在基本相同。但我會在這裏發佈演示:http://www.sqlfiddle.com/#!3/96767/1。請注意,您需要'> = 16',否則您將在下午5點開始。 – mellamokb 2012-04-19 23:56:46

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

它並不一定要在一個存儲過程。

+3

評論其他人的答案並宣傳自己並不是很有幫助或者是面向社區。請不要在將來做這件事。 – mellamokb 2012-04-19 23:10:34

+0

非常有趣,wildplasser。謝謝@mellamokb。 – BoltClock 2012-04-20 12:39:55

1

我不知道確切的MS-syntax-dialect,但我會嘗試證明你不需要IF或CASE構造。我以@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

除了你的「'避免case/else'的任務」導致一個where子句需要對每條記錄進行幾次評估,而我的情況下......可以只評估一次,然後只需要每條記錄一個評估。 – RobIII 2012-04-22 00:07:30

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) 

相當於

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

而且本身等同於

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

重新寫入原來的ELSE子句在自己的權利的IF..THEN語句:

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)) 

兩個表達然後可以以聯合正常形式書寫(「一系列的ANDs)

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 = 'T', '有效', '無效')從一個MYTABLE