php mysql搜索两个日期之间的生日

时间:2012-08-17 14:38:09

标签: php mysql between

我需要从桌子上找到人们的出生日...从今天开始接下来的7天。 我有一个查询.. SELECT * FROMWHERE dob LIKE BETWEEN %-08-17 AND %-08-24但它返回的日期未在数据库中提交的记录。我的意思是条目是有效的 我已将生日日期格式存储在表格中。请帮我找到错误。

5 个答案:

答案 0 :(得分:4)

由于这是mysql,我不知道 DATE_FORMAT() 是否可以解决这个问题。但试一试。

SELECT * FROM users WHERE DATE_FORMAT(dob, '%c-%d') 
BETWEEN DATE_FORMAT('1983-08-17', '%c-%d') 
AND DATE_FORMAT('1983-08-24', '%c-%d') OR (MONTH('1983-08-17') > MONTH('1983-08-24')
AND (MONTH(dob) >= MONTH('1983-08-17') 
OR MONTH(dob) <= MONTH('1983-08-24')))

任何一年都可以使用(只是为了完成日期格式)因为年份并不重要

更新1

在SQLFiddle.com上测试

SQLFiddle Demo

更新2

对不起我的第一个答案。我老实说错过了阅读这一行coming in next 7 days from today。而且我认为这就是我被Imre L投降的原因。他有自己的观点。我之所以发布这样的答案,是因为我认为OP无论year如何都在询问他们之间的日子。所以这是更新。

SELECT ....
FROM   ....
WHERE  DATE(dob) BETWEEN NOW() AND NOW() + INTERVAL 7 DAY

希望现在很清楚。 :d

答案 1 :(得分:1)

当日期范围之间有一个月或一年的变化时,这将正确处理案例:

select *
  from people
 where (DAYOFYEAR(dob)+IF(DAYOFYEAR(CURDATE())>DAYOFYEAR(dob),1000,0)) 
       between DAYOFYEAR(CURDATE()) 
           and (DAYOFYEAR(CURDATE() + INTERVAL 7 DAY)+IF(DAYOFYEAR(CURDATE())>DAYOFYEAR(CURDATE() + INTERVAL 7 DAY),1000,0))

答案 2 :(得分:1)

通过将dob日期转换为今年的日期,您可以避免期间跨越月份或年份边界的问题。这将选择下周出生日期的所有行:

SELECT * FROM users
WHERE concat( year(now()), mid(dob,5,6) ) 
BETWEEN now() AND date_add(now(), interval 7 day)

答案 3 :(得分:0)

SELECT
str_to_date(DATE_ADD(dob, INTERVAL (YEAR(CURRENT_DATE()) - YEAR(dob)) YEAR), '%Y-%m-%d') BIRTHDAY,A.*
FROM app_membership A
WHERE str_to_date(DATE_ADD(dob, INTERVAL (YEAR(CURRENT_DATE()) - YEAR(dob)) YEAR), '%Y-%m-%d') 
      BETWEEN str_to_date('15-10-2017','%d-%m-%Y') and str_to_date('10-11-2017','%d-%m-%Y')
ORDER BY BIRTHDAY ASC;

试试这个。为我工作。

答案 4 :(得分:0)

让我们列出在12月14日到8月24日之间出生在任何月份/年份的人。我们知道它在另一个月之前的一年。我们必须数上一年的数月。这很复杂,因为您可能在将开始日期的月份与结束日期的月份进行比较时遇到问题。但是,可以使用此查询解决此问题:

SELECT * FROM t_users WHERE (DATE_FORMAT(d_birth, '%m-%d') 
BETWEEN DATE_FORMAT('2017-12-14', '%m-%d') AND 
DATE_FORMAT('2018-08-24', '%m-%d'))

OR(MONTH('2017-12-31') >= MONTH('2018-08-24')
AND (MONTH(d_birth) >= MONTH('2017-12-31') 
OR MONTH(d_birth) <= MONTH('2018-08-24')))