在MySQL中查询几个月

时间:2013-12-04 14:37:35

标签: php mysql mysqli

我正试图在当前日期获得有季节开始日期和季节结束日期的行。 但我在冬季的几个月之间有问题。例如,冬季开始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

有人可以帮忙吗?感谢

5 个答案:

答案 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)的情况下,它只是验证它是否在它们之间。

sqlfiddle demo

答案 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(夏季)
 

它完美无缺。