MySQL - 获取星期几

问题描述:

我有一张特别优惠的星期一表。我希望从今天开始提供下一个报价。在表中,天数具有数值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

首先,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

目前尚不清楚什么是预期值和实际值,但我知道你想这样的结果:

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

的事情是,为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