我有一个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'),它不能满足您的要求。
更新资料
为了更好地适应年度变化方案,我更新了SqlFiddle。
where
子句现在基于12*YEAR(..)+MONTH(..)
类型的函数。关于mysql - 返回下个月的行,MYSQL,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32423747/