2012-10-15 5 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 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

yearweek는 물론 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 1 week- interval 0 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

+0

팁 - 덕분에 1 또는 0을 현재 주 (0)와 지난 주 (1)를 구별 할 수있는 함수로 전달할 것이다. 다시 한 번 감사드립니다! –

+0

조인 조건을 이해하는 데 문제가 있습니다.이 조인 절에 ON이 없습니다. 약간 증가 된 텍스트에서 사용하고 있는데 쿼리의 어디에 w.week 값을 인식하지 못합니다. 이것이 어떤 유형의 가입인지에 대한 통찰력? MySQL 네이티브입니까? 내 쿼리에 다른 조인이 있는데이 조인을 추가 할 때 오류가 발생합니다. –

+0

WHERE 절을 변경하지 마십시오.임의의 주를 요구하는 힌트가 없기 때문에 대신 두 개의보기를 사용하십시오. 현재 주에 대한 하나의보기, 이전 주에 대한 하나의보기. –