返回下个月的行,MYSQL

时间:2015-09-06 12:49:36

标签: mysql

我有一个存储用户的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))";

1 个答案:

答案 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')。

<强>更新

为了更好地适应年度变化情景,我更新了SqlFiddlewhere子句现在基于12*YEAR(..)+MONTH(..)类型函数。