我有一个 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
需要“今天之后”的条件,因为在我看来,较早开始的一段时间仍然适用于您所描述的目的。如果,但是,您也希望包含该条件,只需在 WHERE
子句末尾添加 AND start > now()
即可。)
编辑
由于您的 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
。在这里查看您更新的 fiddle :SQLfiddle
我还添加了另一条记录(“Charlie”),但它不满足您的要求。
更新
为了更好地适应年份变化的情况,我更新了我的 SqlFiddle 。 where
子句现在基于 12*YEAR(..)+MONTH(..)
类型函数。
关于mysql - 返回下个月的行,MYSQL,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32423747/