两个月之间的生日(日期)

时间:2012-01-10 23:51:34

标签: mysql

我希望能够在接下来的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之间找到生日......

即使第二个日期小于第一个日期,我如何正确地在两个日期之间进行搜索?

3 个答案:

答案 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 )