我有一个mysql表,用于存储用户的可用性,并将其存储在“开始”和“结束”列中作为日期字段。

我有一个表格,其他用户可以在今天,明天和下周的不同时间搜索“可用性”。我试图弄清楚如何构造查询以获取“下个月”可用用户的所有行。

“开始”值可能从今天开始,“结束”值可能距离三个月,但是如果下个月介于“开始”和“结束”之间,那么我希望返回该行。
我能得到的最接近的是下面的查询,但是它只返回“开始”在下个月之内的行。非常感谢,

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))";

最佳答案

如果您对当前日期后一个月内发生的所有事情都感兴趣,可以尝试执行以下操作:

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日期至少在下个月的期间或之后。

(在我的版本中,我故意省略了start必须在“今天之后”的条件,因为在我看来,一个更早开始的时期仍然适用于您描述的目的。但是,如果您也希望包括该条件,您只需在AND start > now()子句的末尾添加WHERE。)

编辑

由于您的SQLfiddle是用date而不是(我假设是)datetime列设置的,因此您的日期将以类似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(..)类型的函数。

关于mysql - 返回下个月的行,MYSQL,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32423747/

10-14 10:08