mysql - 返回下个月的行,MYSQL

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

最佳答案

由于您对当前日期之后的整月内发生的任何事情感兴趣,您可以尝试如下操作:

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”),但它不满足您的要求。

更新

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

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

相关文章:

mysql - 如何合并两个用户表和关联的用户元表

Mysql触发if语句更新第二张表

mysql - Rails 事件模型协会问题

php - 1and1 托管 : Data migration from shared hosting to VPS

mysql - 按行级别的 SQL 过滤器

mysql - 为什么 MySQL 禁用加载本地 infile 不起作用?

php - PHP/MySQL 中的最新条目按升序排列

mysql - 计算 2 列的发生次数

MYSQL GROUP BY WITH ROLLUP 使具有最多 NULL 值的元组首先出现

案例内的 MYSQL 条件不起作用