我正在寻找解决方案但到目前为止尚未成功。 我的MySQL表($ people_table)在“date”类型的“birthdatetr”列中保存生日,数据以“YYYY-MM-DD”格式存储(例如:1789-04-02)
根据当前日期,我指定一个感兴趣的范围。 我正在计算当前的一周:
$lastmonday = date('m-d', strtotime('last monday'));
$nextsunday = date('m-d', strtotime('next sunday'));
我想选择生日在此范围内的所有行。 (该应用程序是带有系谱数据的网站,显示所有生日都发生在同一周的那么多年前)
我设法通过计算一年中的某一天来完成它:
$lastmonday_doy = date('z', strtotime('last monday'));
$nextsunday_doy = date('z', strtotime('next sunday'));
SELECT * FROM $people_table WHERE DAYOFYEAR(birthdatetr) BETWEEN $lastmonday_doy AND $nextsunday_doy;
这个想法是绕过任何月份换行的麻烦。但是当年度结束时,这仍然不起作用。此外,我担心这是否非常昂贵,因为该表可能在将来保持> 5000行。
最后,DAYOFYEAR()方法不考虑闰年。
目前,还有另一个实现大致有效,但我不理解,因此我无法改变它。它看起来非常复杂:
$query = "SELECT birthdatetr, YEAR(birthdatetr) AS BirthYear, birthdatetr + INTERVAL YEAR('" . $datetouse . "') - YEAR( birthdatetr ) + ( (birthdatetr + INTERVAL YEAR('" . $datetouse . "') - YEAR( birthdatetr ) YEAR) < '" . $datetouse . "') YEAR as nextbirthday
FROM $people_table
WHERE DATEDIFF( birthdatetr + INTERVAL YEAR('" . $datetouse . "') - YEAR( birthdatetr ) + ( ( birthdatetr + INTERVAL YEAR('" . $datetouse . "') - YEAR(birthdatetr) YEAR) < '" . $datetouse . "') YEAR, '" . $datetouse . "') <= $futuredays ORDER BY nextbirthday, birthdatetr";
此处,当前日期为$ datetouse,$ futuredays指定范围的长度。 (在这个例子中,$ futureday = 7;)
是否有轻量级的方法来选择所需的数据?
谢谢!
答案 0 :(得分:0)
对于一周的要求,可以更简单地替换
WHERE DAYOFYEAR(birthdatetr) BETWEEN $lastmonday_doy AND $nextsunday_doy
与
WHERE DAYOFYEAR(birthdatetr) in (7 day numbers for the 7 weekdays)
并将7个参数传递给查询(星期一,星期二......星期日)
答案 1 :(得分:0)
好的,这是最后的SQL语句。感谢StanislavL:
SELECT birthdatetr as datedisplay FROM tng_people
WHERE DATE_FORMAT(birthdatetr, '%m-%d') IN ('05-12', '05-13', '05-14', '05-15', '05-16', '05-17', '05-18')
UNION ALL
SELECT deathdatetr as datedisplay FROM tng_people
WHERE DATE_FORMAT(deathdatetr, '%m-%d') IN ('05-12', '05-13', '05-14', '05-15', '05-16', '05-17', '05-18')
UNION ALL
SELECT marrdatetr as datedisplay FROM tng_families
WHERE DATE_FORMAT(marrdatetr, '%m-%d') IN ('05-12', '05-13', '05-14', '05-15', '05-16', '05-17', '05-18')
ORDER BY DAYOFWEEK(datedisplay)