我希望能够在接下来的30天内找到有生日的人。因此,如果今天是1月11日,我想找到1月11日至2月10日生日的人。
我的代码似乎有效
DATE_FORMAT(birthday, '%m-%d') >= '01-11' AND DATE_FORMAT(birthday, '%m-%d') <= '02-10')
如果日期是12月11日,它将显示如下:
DATE_FORMAT(birthday, '%m-%d') >= '12-11' AND DATE_FORMAT(birthday, '%m-%d') <= '01-10')
显然这不会奏效,因为它试图在12-11和01-10之间找到生日......
即使第二个日期小于第一个日期,我如何正确地在两个日期之间进行搜索?
答案 0 :(得分:4)
datediff
函数返回两个日期之间的天数。 now
返回当前日期和时间。
SELECT birthday
FROM dates
WHERE datediff( MAKEDATE( YEAR(NOW()) , DAYOFYEAR(birthday) ) , NOW())
BETWEEN 0 AND 30
OR datediff( MAKEDATE( YEAR(NOW())+1 , DAYOFYEAR(birthday) ) , NOW())
BETWEEN 0 AND 30;
如果birthday
已经已经发生,datediff(birthday,NOW())
将返回一个负数。因此,我们需要获得值between
0和30。
答案 1 :(得分:2)
我不知道您是如何生成查询的,但如果您要查询的日期是&gt; = '12 -2',则只需将AND
与{交换} {1}}。
如果你想在使用OR
的单个查询中执行此操作有点棘手,但如果你在php或类似的东西中对查询进行编码则很简单。
如果您想要单个查询,请执行以下操作:
NOW()
这是一个很糟糕的查询,但我认为它可以满足您的需求:
如果今天是在12月1日之前,请选择&gt; =今天SELECT [...] FROM [...] WHERE
(DATE_FORMAT(NOW(), '%m-%d') < '12-2' AND DATE_FORMAT(birthday, '%m-%d') >= DATE_FORMAT(NOW(), '%m-%d') AND DATE_FORMAT(birthday, '%m-%d') <= DATE_FORMAT(DATE_ADD(NOW(), INTERVAL 30 DAY), '%m-%d')) OR
(DATE_FORMAT(NOW(), '%m-%d') >= '12-2' AND (DATE_FORMAT(birthday, '%m-%d') >= DATE_FORMAT(NOW(), '%m-%d') OR DATE_FORMAT(birthday, '%m-%d') <= DATE_FORMAT(DATE_ADD(NOW(), INTERVAL 30 DAY), '%m-%d')))
&lt; =今天+ 30,所有日期,
否则取所有日期&gt; =今天AND
&lt; =今天+30(在这种情况下明年会是什么)
答案 2 :(得分:2)
在处理日期和时间时,应该注意字符串和整数,并使用现有的函数来操作它们。
SELECT . FROM .
WHERE MAKEDATE( YEAR(CURDATE()), DAYOFYEAR(birthday)
BETWEEN CURDATE() AND DATE_ADD( CURDATE(), INTERVAL 30 DAY )
OR MAKEDATE( YEAR(CURDATE())+1, DAYOFYEAR(birthday)
BETWEEN CURDATE() AND DATE_ADD( CURDATE(), INTERVAL 30 DAY )