2015-09-06 39 views
0

我有一个存储用户的可用性,存储在‘开始’和‘结束’列作为日期字段一个MySQL表。返回行下个月,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))"; 

回答

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日期至少或下个月的时期后。 (在我的版本中,我故意排除了start需要“在今天之后”的情况,因为在我眼中看起来较早的一段时间似乎仍然适用于您描述的目的。但是,如果您希望这种情况包括太,你可以简单地在你WHERE条款的末尾添加一个AND start > now()。)

编辑

当您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

我还添加了另一个记录('查理'),它不符合您的要求。

更新

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

+0

非常感谢但是我无法使这项工作。我已经做了这个sqlfiddle,也许你可以解释为什么查询返回零结果。http://sqlfiddle.com/#!9/811626/3 – JulianJ

+0

我更新了我的答案。提示:如果对结果不确定,请尝试使用“select start + 0”。这将以数字格式输出开始日期,然后由我的分部和场地操作进行操作。 – cars10m

+0

它完美地解释和奇妙地解释。非常感激。 – JulianJ