2015-08-16 65 views
1

我需要解决一个微不足道的问题。 打印庆祝节日前的天数。 我使用以下。 SQL查询再次计算天数

$query='SELECT * FROM '.$table.' WHERE DATE_FORMAT(holiday,CONCAT(YEAR(CURDATE()),"-%m-%d"))BETWEEN CURDATE() AND DATE_ADD(CURDATE(), INTERVAL 10 DAY)'; 

所以我得到正确的事件数量在未来10天。

如果是生日,我需要打印天数。 I.E. 1983年8月20日 - 将在4天内完成。 我在做什么?

$holiday=new DateTime($row['holiday']); 
$today = new DateTime("today"); 
$diff =$holiday->diff($today)->d; 

而且我得到了27 ..这是正确的!由于31年11个月和27天的差异。我可以计算一个月内的总天数,并且可以计算31-27,但这似乎不是最好的方法。 如果我格式化日期我得到字符串和差异不起作用...
任何更容易solutuions - 如何比较日期不考虑年份属性? p.s.不想使用moment.js ..我相信,PHP可以解决它。 p.p.s.也许我应该调整我的SQL查询?

+0

因此,您正在寻找一种方法来选择相同的查询,未来10天的生日列表以及生日前的剩余天数? – berty

+0

yeap - correct) –

回答

1

你需要修改今年的假期,以便它成为今年的生日。

$holiday=new DateTime($row['holiday']); 
$holiday->setDate(date("Y"), $holiday->format("m"), $holiday->format("d")); 

$today = new DateTime("today"); 
$diff = $holiday->diff($today); 

echo $diff->d; // = 4 
+0

非常棒,简单!非常感谢。问题在于 - > q差异。如果生日是今天 - 那个年龄(差异)显示新的年龄。但是如果这个birhtday会在4天内出现 - > y差异显示它是当前的年龄。任何情况 - 伟大的工作。这将有很大的帮助。 –

0

我想你可以用一个SQL查询做到这一点,例如:

SELECT 
    people.Id, 
    CONCAT(
     YEAR(CURDATE()), 
     '-', MONTH(people.Birthdate), 
     '-', DAY(people.Birthdate) 
    ) AS CelebratingBirthday, 
    DATEDIFF(
     CONCAT(
      YEAR(CURDATE()), 
      '-', MONTH(people.Birthdate), 
      '-', DAY(people.Birthdate) 
     ), 
     CURDATE() 
    ) AS RemainingDays 

    FROM people 
    HAVING RemainingDays BETWEEN 0 AND 10; -- remember RemainingDays can be <0 so WHERE RemaingingDays <= 10 is not relevant 

我不如果使用DATE_FORMAT(在你原来的查询)知道,而不是直接CONCAT YEAR() ,MONTH()和DAY()更有效率。如果您需要管理大量数据,请考虑进行测试。

注意:我认为MySQL查询优化器只会处理表达式CONCAT(...)一次,因此如果它在查询中出现两次,不用担心。

如果您要管理的数据量非常大,则可能需要计算每个新年的每个人的生日。它将避免在每个查询中处理它,并且会更高效。例如,你可以在你的系统上定义一个cron,或者如果你使用最新版本的话,你可以在MySQL中定义一个事件。

+0

谢谢 - 这就是我想要做的..但我的语法不正确。 A有10-12,000人的基数..我不确定它是否是一个巨大的基地) –