2012-03-22 28 views
0

我有一个字段为birthday(日期)的用户表。改善查询以选择距离现在(未来和过去)x天内的(出生)日期

目前,我选择的用户是谁的生日是7天内过去或未来的当前日期是这样的:

SELECT * FROM users 
WHERE 
    DATE_FORMAT(birthday, '1980-%m-%d') 
     BETWEEN 
     DATE_FORMAT(DATE_SUB(CURRENT_DATE(), INTERVAL 7 day), '1980-%m-%d') 
     AND 
     DATE_FORMAT(DATE_ADD(CURRENT_DATE(), INTERVAL 7 day), '1980-%m-%d') 

正如你可以看到,这个查询是不是最精简的,考虑通过比较制作1980年日期格式。此外,我相信这将无法在一年中的最后一周和第一周中正确选择生日用户。

当我看到这个问题时,我很难找到如何解决这个问题。我能做些什么来改善这个查询?

+0

我已经更新了我的意见,并提出在PHP合适的解决方案。 – 2012-03-22 09:58:59

回答

3

试试这个过滤器 -

WHERE 
    birthday + INTERVAL EXTRACT(YEAR FROM NOW()) - EXTRACT(YEAR FROM birthday) YEAR 
    BETWEEN CURRENT_DATE() - INTERVAL 7 DAY AND CURRENT_DATE() + INTERVAL 7 DAY 
+0

这是优雅的,从一个快速检查我会说它的工作。将现在到生日的年份添加到生日日期,然后来回检查7天。谢谢。 – kontur 2012-03-22 10:00:32

1
$int_range = 7; 

$int_start = strtotime("today -{$int_range} Days") 
$arr_days = array(); 
for($i = 1; $i <= ($int_range * 2); $i++) 
    $arr_days[] = "'".date('m-d', strtotime("+{$i} Days", $int_start))."'"; 

$str_days = implode(', ', $arr_days); 

mysql_query(" 
SELECT * FROM users 
WHERE DATE_FORMAT(birthday, '%m-%d') IN ({$str_days}) 
"); 
+0

感谢您的同样好的答案。我授予Devart正确答案,因为我更喜欢针对这个特定问题的仅用于mysql的方法。 – kontur 2012-03-22 13:56:21

+1

除了php之外,我们的查询的一个不同之处在于,Devart的解决方案将显示每年2月29日的生日,而我的每年只有4年。我不确定你喜欢哪一个。但这是一个小错误,它可能不值得关心:) – 2012-03-22 14:05:33

+0

考虑到有问题的网站,不,:)谢谢你的额外考虑。 – kontur 2012-03-22 14:19:48

相关问题