我是SQL Server的新手。請幫助我在查詢中編寫以下邏輯。如果SQL查詢中的條件
If getnow() > today 4 PM
Then
SELECT *
FROM table
WHERE MailDate is Tomorrow
Else
SELECT *
FROM table
WHERE MailDate is Today
我是SQL Server的新手。請幫助我在查詢中編寫以下邏輯。如果SQL查詢中的條件
If getnow() > today 4 PM
Then
SELECT *
FROM table
WHERE MailDate is Tomorrow
Else
SELECT *
FROM table
WHERE MailDate is Today
select *
from table
where DATEDIFF(day, GETDATE(), maildate) = case when
DATEPART(hour, GETDATE()) >= 16 then 1 else 0
end
您需要一個存儲過程來在SQL中執行此操作。看看這裏的文檔http://msdn.microsoft.com/en-us/library/aa174792(v=sql.80).aspx
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。
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
爲什麼醜陋的鑄造來回(與「魔術[風格常量](http://msdn.microsoft.com/ en-us/library/aa226054(v = sql.80).aspx)「(例如'101')代碼,任何人都不會記住,varchars是一個字符串中的一個時間值,包括一個空格,如果忘記了,它會打破所有內容。 )如果有日期時間功能? – RobIII 2012-04-19 23:14:21
@RobIII你是對的,它是固定的。我只是提供了另一種方式來做到這一點,但我沒有說這是最好的方式。 – Taryn 2012-04-19 23:16:07
我已經刪除了我的答案,因爲它們現在基本相同。但我會在這裏發佈演示:http://www.sqlfiddle.com/#!3/96767/1。請注意,您需要'> = 16',否則您將在下午5點開始。 – mellamokb 2012-04-19 23:56:46
我不知道確切的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)
;
除了你的「'避免case/else'的任務」導致一個where子句需要對每條記錄進行幾次評估,而我的情況下......可以只評估一次,然後只需要每條記錄一個評估。 – RobIII 2012-04-22 00:07:30
這裏的想法是使用蘊含重寫規則:
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))
兩個表達然後可以以聯合正常形式書寫(「一系列的AND
s)
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)) ;
選擇a.name,如果(a.is_active = 'T', '有效', '無效')從一個MYTABLE
嘿RobIII,哥們。只是想說,我確實鼓勵了你,但降價可能是這篇文章中對話的結果。不要個人承擔,我們都可以總是學到一些東西:)只要記住想想你在發佈的內容時所說的內容,並考慮如何將其發佈給其他人。我和這裏的其他人努力使這個友好的社區歡迎所有技能水平並給每個人一個機會。它看起來像你的標記也是答案,所以恭喜,祝你有美好的一天! – mellamokb 2012-04-20 00:08:29
Roblll, 我向你致敬,如果它讓你感覺更好,我想說我實現了你的代碼,因爲它看起來非常有效。當然,我理解它需要一段時間。 :)非常感謝 – user1345260 2012-04-20 00:10:09