选择包含当前周内日期的SQL项目

时间:2015-01-22 19:59:45

标签: php mysql sql date

我们有一个电影数据库,需要选择当前一周内开始和结束日期的电影。我们在SQL表中有两列,都是“date”类型,并以2015-01-25(ISO)(YYYY-MM-DD)格式编写。我们需要选择当前周内发生的条目。电影的开始日期通常是一周的星期五,结束日期通常是一周的星期日。我希望能够展示即将到来的周末即将上映的电影,无论他们检查的那一天是哪一天。我编写了以下PHP和SQL查询,但是当我回显$ result时,我没有收到任何数据。

$date = strtotime("now");
$last = strtotime('next Sunday');
$date = date('Y-m-d',$date);
$last = date('Y-m-d',$last);

$result = mysql_fetch_array(mysql_query("SELECT * FROM campusFilms WHERE startDate BETWEEN $date AND $last"));

非常感谢任何帮助,我很乐意详细说明所需的一切。我已经搜索了其他StackOverflow问题,但没有一个人能够回答这个具体案例。

3 个答案:

答案 0 :(得分:3)

SELECT * 
  FROM campusFilms 
 WHERE WEEK('2015-02-05') BETWEEN WEEK(startDate) AND WEEK(endDate);

http://sqlfiddle.com/#!2/476d3/3

此解决方案无法使用索引,因此,如果性能存在问题,我们可以查看替代解决方案。

答案 1 :(得分:2)

为什么不使用YEARWEEK()

SELECT whatever_you_need 
FROM campusFilms 
WHERE YEARWEEK(CURDATE()) BETWEEN YEARWEEK(startDate) AND YEARWEEK(endDate);

yearweek返回任何给定日期的年份和星期,该日期将处理多年。

答案 2 :(得分:1)

如果您只想找到startdate在当周的星期五和星期日之间的记录,那么您甚至不需要使用PHP来计算日期,您可以让mysql做所有的工作:

SELECT *
  FROM campusFilms
 WHERE startDate BETWEEN
       DATE_ADD(CURDATE(), INTERVAL(-2 + MOD(8-DAYOFWEEK(CURDATE()),7)) DAY)
       AND
       DATE_ADD(CURDATE(), INTERVAL(MOD(8-DAYOFWEEK(CURDATE()),7)) DAY)

无论今天星期几是什么,这都有效。如果是星期五,它将在今天和后天之间为您提供电影。星期六,它会在昨天和明天之间为你拍摄电影,周日,它会在两天前和今天之间为你拍摄电影。