1

我有一个查询,它按任务计算本周工作的总小时数:

SELECT name AS 'Task Name'
       , sum(hours) AS `Total Hours`
        FROM time_records
        WHERE yearweek(record_date, 3) = yearweek(now(), 3)
        GROUP BY
        weekday(record_date), name

WHERE 子句指定当前周:

WHERE yearweek(record_date, 3) = yearweek(now(), 3)

此数据使用 MySQL 查询和 PDO 语句显示为表。

我现在想为查看者添加一个选项,通过单击表格下方的链接(例如,“上一周”)来查看前一周的数据。为了显示该数据,我需要更新 WHERE 子句以查询前一周的数据:

   WHERE yearweek(record_date, 3) = yearweek(now(), 3) - 1

我想知道最好的方法是什么?我宁愿只保留整个查询的一个版本。一种想法是使用PHP将“- 1”添加到查询中,例如:

WHERE yearweek(record_date, 3) = yearweek(now(), 3) <?php if (prev) {echo "- 1" ;} ?>

我认为这应该可行,但我如何确定 prev 条件?我是否应该将整个查询放在一个函数中,以便默认情况下它可以是“Time_hours(0)”,而之前的查询可以是“Time_hours(1)” - 还是有更好的方法?

我担心保持代码可管理并遵循最佳实践。任何提示将不胜感激。谢谢!

4

1 回答 1

3

我建议您尝试一个查询,该查询具有您要处理的几周前的参数。YEARWEEK 对于每周处理来说是一个糟糕的选择,因为它处理年终展期的效果很差。

试试这个,如果你的星期从星期日开始。这将给出当前周。

select r.record_id, r.record_date, w.week weekstart
from record r
join (
    select 
      (FROM_DAYS(TO_DAYS(CURDATE()) -MOD(TO_DAYS(CURDATE()) -1, 7)) 
           - interval 0 week) week
 )w
where record_date >= w.week
  and record_date < w.week + interval 1 week

小提琴:http ://sqlfiddle.com/#!2/4c487/1/0

如果您愿意,比方说一周前,请在您的查询中更改- interval 0 week为。- interval 1 week看到这个小提琴。http://sqlfiddle.com/#!2/4c487/2/0

您可以放置​​任意数量的前几周,甚至是跨年结束的几周。interval -42 week例如, 请参见此处。http://sqlfiddle.com/#!2/4c487/3/0

该表达式FROM_DAYS(TO_DAYS(CURDATE()) -MOD(TO_DAYS(CURDATE()) -1, 7))将当前日期向下舍入到上一个星期日。如果要将其四舍五入到前一个星期一,请使用FROM_DAYS(TO_DAYS(CURDATE()) -MOD(TO_DAYS(CURDATE()) -2, 7)). 例如:http ://sqlfiddle.com/#!2/4c487/8/0

于 2012-10-15T19:56:16.003 回答