0

我有一张提供周一至周日特别优惠的桌子。我希望从今天开始获得下一个报价。表中的天数为 1-7

例如。

1(mon)-offer1

2(tues)-offer2

3(wed)-offer3

6(Sat)-offer4

如果今天是周日 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
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 回答