2012-10-15 102 views
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" ;} ?> 

我认为这应该工作,但我怎么能确定分组情况?我应该让整个查询在一个函数内部,这样默认情况下它可以是“Time_hours(0)”,前一个可以是“Time_hours(1)” - 或者有更好的方法吗?

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

+1

当然,如果您在一个日历年的第一个星期内使用“上周”,则“年周”当然会产生无用的结果。 –

+0

@OllieJones你会推荐什么?我知道这是我需要在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 weekhttp://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

+0

之前解决的问题 - 感谢提示,我将使1或0通过将区分当前周(0)和上周(1)的函数传递。再次感谢! –

+0

我无法理解您的连接条件 - 此连接子句没有ON。我在稍微增加的文本中使用它,查询的WHERE不识别w.week值。深入了解这是什么类型的连接?它是MySQL的本地?我在查询中有一些其他连接,并且出现错误,试图添加此连接。 –

+0

不要更改WHERE子句。没有暗示任意星期是需求,所以请使用两个视图。本周的一种观点,前一周的一种观点。 –