选择没有年份的日期范围

时间:2014-05-14 07:57:38

标签: mysql sql date

我正在寻找解决方案但到目前为止尚未成功。 我的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;)

是否有轻量级的方法来选择所需的数据?

谢谢!

2 个答案:

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