2012-04-20 261 views
0

我有一張特別優惠的星期一表。我希望從今天開始提供下一個報價。在表中,天數具有數值1-7MySQL - 獲取星期幾

例如,

1(mon)-offer1 

2(tues)-offer2 

3(wed)-offer3 

6(Sat)-offer4 

如果今天是Sun DAYOFWEEK 7那麼我希望找回的報價是offer1這是下一個可用週一DAYOFWEEK 1.如果今天是週五,那麼我會得到offer4。

這是我擁有的SQL。問題是我無法使offer1場景正常工作。

SELECT * 
FROM special_offers 
WHERE special_offers.special_day >= IF(DAYOFWEEK(NOW())-1>0,DAYOFWEEK(NOW())-1,7) 
    AND special_offers.pubID = 48 
LIMIT 1 
+0

預期產量是多少?實際產出是多少? – 2012-04-20 18:48:05

+0

只是確保。星期六的錯字?應該是4?至少週一和週六不應該是一樣的。 – 2012-04-20 18:48:12

+0

對不起,週六是6 – 2012-04-20 18:52:08

回答

1

首先,MySQL DAYOFWEEK()函數的返回值在週日有1個,在週六有7個。所以如果你的表有1個星期一和7個星期天,你需要調整1.

第二,你需要的是模塊化算術。這對你有用嗎?

SELECT * 
    FROM special_offers 
ORDER BY (special_offers.special_day + 8 - DAYOFWEEK(NOW())) MOD 7 
    LIMIT 1 
+0

謝謝,就是這樣,永遠不會有。感謝其他人的幫助。不容易理解。 – 2012-04-20 19:57:13

1

目前尚不清楚什麼是預期值和實際值,但我知道你想這樣的結果:

SELECT * 
FROM special_offers 
WHERE special_offers.special_day >= case DAYOFWEEK(NOW()) when 1 then 7 when 2 then 1 when 3 then 2 when 4 then 3 when 5 then 4 when 6 then 5 when 7 then 6 end 
AND special_offers.pubID = 48 
LIMIT 1 

編輯: 這將試着從今天的下一個可用的特別優惠直到星期天,如果沒有找到,它會找到第一個特別優惠。

SELECT * 
FROM special_offers so 
WHERE so.pubID=48 
ORDER BY 
if(special_day = case DAYOFWEEK(NOW()) when 1 then 7 when 2 then 1 when 3 then 2 when 4 then 3 when 5 then 4 when 6 then 5 when 7 then 6 end, 1, 0) desc, so.special_day 
limit 1 
+0

如果今天是星期五是DAYOFWEEK 5,那麼SQL將帶回sat的條目,這是DAYOFWEEK 6.我的問題是,如果是星期日是7,那麼我需要得到星期一,這是下一個提議。我希望這更有意義? – 2012-04-20 19:17:30

+0

如果我理解正確,我做了一個改變。 (不知道我理解正確的整週期望,所以測試我的查詢) – 2012-04-20 19:26:24

+0

嗨Nesim,我的問題不是我需要正常化DAYOFWEEK命令(雖然我確實需要這樣做,因爲這可以支持一個問題)。我試圖解決的是,如果今天是一週結束,那麼我的查詢將不會再次獲得下一個報價,因爲它從1開始。> =只會在開始時得到結果 – 2012-04-20 19:34:11

2

的事情是,爲MySQL DAYOFWEEK功能Mondey等於2 Sundey等於1,看manual

您的問題簡單的解決方法是,如果語句中使用:

IF(DAYOFWEEK(NOW())-1>0,DAYOFWEEK(NOW())-1,7) 

這天數字轉換爲正常秩序。

+0

怎麼樣?這不會標準化日子。今天是星期五,你需要得到5.但是「選擇IF(DAYOFWEEK(NOW()) - 1> 0,DAYOFWEEK(NOW()),7);」將返回6,因爲dayofweek(now)是6,並且6-1 = 5> 0將變爲if語句並返回自身。 – 2012-04-20 19:13:20

+0

對不起,忘了添加「-1」語句;) – 2012-04-20 19:18:40

+0

謝謝,這很有道理。但是,如果我是太陽的話,我也會遇到同樣的問題,那麼我需要返回並獲取星期一或下一個可用優惠 – 2012-04-20 19:26:16