【问题标题】:php mysql search birthday between two datesphp mysql搜索两个日期之间的生日
【发布时间】:2012-08-14 00:33:22
【问题描述】:

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

【问题讨论】:

标签: php mysql between


【解决方案1】:

既然是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 否决的原因。他有他的观点。我发布这样的答案的原因是因为我认为无论year如何,OP都在要求两者之间的日子。所以这里是更新。

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

希望现在很清楚。 :D

【讨论】:

  • 聪明。这比我在数据集(只是一个包含大量记录和日期的随机表)上的想法好大约十分之一秒。我挖了。
  • 如果当前日期是 2012-08-30 并且 +7 是 2012-09-06 怎么办?同样如果当前日期是 2012-12-30 怎么办?
  • @MetalFrog 测试它并且它工作了SQLFiddle Demo Link
  • -1 因为它在 2 种情况下完全被破坏:1)当接下来 7 天的年份发生变化时 2)当它在接下来的 7 天是 10 月时(它是一个字符串比较)
  • 您的答案已编辑答案仍然错误。因为数据库中的任何人将来都不可能过生日=)
【解决方案2】:

这将正确处理日期范围之间有一个月或一年变化的情况:

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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      【解决方案4】:
      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;
      

      试试这个。为我工作。

      【讨论】:

        【解决方案5】:

        让我们列出出生于 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')))
        

        【讨论】:

          猜你喜欢
          • 2015-06-13
          • 1970-01-01
          • 2015-07-01
          • 1970-01-01
          • 1970-01-01
          • 2021-10-03
          • 1970-01-01
          • 2021-07-06
          • 2023-04-08
          相关资源
          最近更新 更多