我有一个存储用户的mysql表'可用性,存储在' start'并且'结束'列作为日期字段。
我有一个表单,其他用户可以在其中搜索“可用性”字样。有各种时期,如今天,明天和下周。我试图弄清楚如何构建查询以获取下个月可用的用户的所有行。
'开始'价值可能来自今天和结束'价值可能会在三个月之后,但如果下个月介于' start'并且'结束'然后我想要返回那一行。 我可以得到的最近的是下面的查询,但只返回“开始”的行。在下个月内。非常感谢,
sql= "SELECT * FROM mytable WHERE start BETWEEN DATE_SUB(LAST_DAY(DATE_ADD(NOW(), INTERVAL 1 MONTH)),INTERVAL DAY(LAST_DAY(DATE_ADD(NOW(), INTERVAL 1 MONTH)))-1 DAY) AND LAST_DAY(DATE_ADD(NOW(), INTERVAL 1 MONTH))";
答案 0 :(得分:1)
由于您对当前日期之后的整个月内发生的任何事情感兴趣,您可以尝试这样的事情:
SELECT * FROM mytable WHERE
FLOOR(start/100000000)<=FLOOR(NOW()/100000000)+1 AND
FLOOR( end/100000000)>=FLOOR(NOW()/100000000)+1
此查询利用datetime
值在内部存储在MySql中的事实,如
SELECT now()+0
--> 20150906130640
其中数字09
表示当前月份。 FLOOR(NOW()/100000000)
会过滤掉该数字的前几位数字(在本例中为201509
)。 WHERE
条件现在只是测试start
日期是否在下个月结束之前的任何地方,并且end
日期至少是 in或在下个月的之后。
(在我的版本中,我特意遗漏了start
在今天之后需要的条件“,因为我眼前的一段时间似乎仍然适用于你描述的目的。但是,如果你想要包含这个条件你也可以在AND start > now()
子句的末尾添加WHERE
。)
修改强>
由于您的SQLfiddle设置为使用date
而不是(我假设的)datetime
列,您的日期将以mumeric格式(如20150907
)和简单的方式表示不同除以100现在可以获得所需的月份数进行比较(201509
):
SELECT * FROM mytable WHERE
FLOOR(start/100)<=FLOOR(NOW()/100000000)+1 AND
FLOOR( end/100)>=FLOOR(NOW()/100000000)+1
NOW()
返回的数字仍为14位数字,需要除以100000000
。请在此处查看更新后的小提琴:SQLfiddle
我还添加了另一条不符合您要求的记录('Charlie')。
<强>更新强>
为了更好地适应年度变化情景,我更新了SqlFiddle。 where
子句现在基于12*YEAR(..)+MONTH(..)
类型函数。