我正试图在当前日期获得有季节开始日期和季节结束日期的行。 但我在冬季的几个月之间有问题。例如,冬季开始01.11,结束于28.02(我不关心27或28)
当我尝试在冬天获得产品时,如下面的查询
SELECT *
FROM products P
LEFT JOIN seasons S ON P.s_id = S.id
WHERE MONTH(CURDATE()) BETWEENS MONTH(S.startdate) and MONTH(S.enddate)
我什么都没得到
表seasons
有一行值低于
id = 1
Description = Winter
startdate = 2013-11-01
enddate = 2014-02-28
!重要
我不关心year
有人可以帮忙吗?感谢
答案 0 :(得分:3)
您可以通过CASE实现此目的:
SELECT *
FROM products P
LEFT JOIN seasons S ON P.s_id = S.id
WHERE CASE
WHEN MONTH(S.startdate) > MONTH(S.enddate)
AND (MONTH(CURDATE()) > MONTH(S.startdate)
OR MONTH(CURDATE()) < MONTH(S.enddate))
THEN 1
WHEN MONTH(S.startdate) <= MONTH(S.enddate)
AND MONTH(CURDATE()) BETWEEN MONTH(S.startdate) AND MONTH(S.enddate)
THEN 1
ELSE 0
END
这假定每当MONTH(startdate)&gt;月(结束)这一年已经改变。 只要MONTH(curdate())大于MONTH(startdate)或小于MONTH(enddate),就会返回true。
在MONTH(startdate)&lt; = MONTH(enddate)的情况下,它只是验证它是否在它们之间。
答案 1 :(得分:1)
你为什么会得到任何东西?你做的相当于
WHERE 5 BETWEEN 'yyyy-mm-dd' AND 'yyyy-mm-dd'
你正在进行文字苹果/橘子比较。也许你想要
WHERE MONTH(CURDATE()) BETWEEN MONTH(S.startdate) AND MONTH(S.enddate)
而是,所以你正在做苹果。
答案 2 :(得分:1)
我不喜欢奇怪的转换为字符串和解析解决方案。你可以用一点点数学来做到这一点......
SELECT *
FROM products P
LEFT JOIN seasons S ON P.s_id = S.id
WHERE ((DAYOFYEAR(CurDate()) - DAYOFYEAR(S.startdate)) + 365) % 365 BETWEEN 0 AND
(((DAYOFYEAR(S.enddate) + 365) - DAYOFYEAR(S.startdate))) % 365
答案 3 :(得分:0)
之间要求值按顺序排列 - 您的开始日期是在结束日期之后,因此您将始终得不到任何结果。
此外,您要将月份与日期进行比较;由于日期是年份,你不能忽视那一年。
您必须比较一年中的日期以忽略年份。如果DAYOFYEAR(curdate())介于DAYOFYEAR(结束日期)和DAYOFYEAR(开始日期)之间,如果结束数据和开始日期都在同一年,则该数据将起作用。如果他们在不同年份,你需要得到一点点发烧友,但这应该是显而易见的。
另外,你可能需要思考“不关心一年”的真正含义。如果您正在寻找3月到9月之间的日期,那么将会查找9月到3月之间的日期。你想要的将改变你的编程方式。
答案 4 :(得分:0)
我找到了解决方案。
SELECT *
FROM products P
LEFT JOIN seasons S ON P.s_id = S.id
WHERE
IF(
( CURDATE() BETWEEN STR_TO_DATE( CONCAT( YEAR(CURDATE()),'-',MONTH(S.startdate),'-',DAY(S.startdate)) , '%Y-%m-%d') AND STR_TO_DATE( CONCAT( IF( MONTH(S.`enddate`) < MONTH(S.`startdate`) ,YEAR(CURDATE())+1,YEAR(CURDATE()) ),'-',MONTH(s.`enddate`),'-',DAY(S.`enddate`)) , '%Y-%m-%d') ),
"IN Season",
IF( P.`s_id` IS NOT NULL AND P.`s_id` != "","Out OF Season","" )
) = "IN Season"
我有2行
1.开始日期:2013-11-01 EndDate:2014-02-28(冬季)
2. StartDate:2013-06-01 ENDDate:2013-08-31(夏季)
它完美无缺。