0

月曜〜日曜の特別オファーのテーブルがあります。今日から次のオファーを利用できるようにしたいと思います。表では、日数は1〜7の数値です。

例えば。

1(mon)-offer1

2(tues)-offer2

3(wed)-offer3

6(Sat)-offer4

今日がSunDAYOFWEEK7の場合、私が取り戻したいオファーは、次に利用可能な月のDAYOFWEEK 1であるoffer1です。今日が金曜日の場合、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
4

3 に答える 3

2

MySQL DAYOFWEEK関数の場合、Mondeyは2に等しく、Sundeyは1に等しいということです。マニュアルを参照してください。

問題の簡単な回避策は、ifステートメントを使用することです。

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

これにより、日数が通常の順序に変換されます。

于 2012-04-20T19:00:49.930 に答える
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
于 2012-04-20T18:58:08.543 に答える
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
于 2012-04-20T19:48:58.177 に答える