2013-01-22 4 views
5

다음과 같은 쿼리가 있습니다. PHP와 MySQL의 주 차이점

SELECT COUNT(*), WEEK(date), YEAR(date) FROM myTable GROUP ON YEAR(date), WEEK(date) 

는 다음과 같은 결과

지금 2012 년의 35 나는, 그러나 나의 WHERE 절에 WEEK(date)=35 AND YEAR(date)=2012을 사용하지 않으 주에 모두 39 개 기록을 얻으려면
32 33 2012 
43 34 2012 
39 35 2012 
17 36 2012 

을 생산하는 말 색인을 활용하지 않습니다. 대신 경계를 찾고 조건문을 사용하고자합니다. 반올림 오류가 발생할 수 있으므로 BETWEEN을 사용하지 않으려합니다.

그러므로 나는 다음과 같은 생각을 시도해보십시오. 그러나 모두 39 개의 레코드를 얻지는 마십시오. 분명히 MySQL과 PHP는 몇 주 동안 다르게 처리합니다. 나는 MySQL WEEK()가 0, 2, 4, 6 모드를 사용하여 일요일로 시작하는 주를 모두 반환한다는 것을 알았다. 사람들이 가장 일반적으로 사용하는 것이 가장 이상적입니다. 가장 중요한 것은 DateTime에서 제공하는 것과 동일하다는 것입니다. 내가 어떻게 그럴 수 있니? 감사합니다

$w=35;$y=2012; //Given 
$w=sprintf('%02d',$w); //Make sure it is two digits 
$date = new DateTime($y.'W'.$w); 
$d1=$date->format('Y-m-d'); 
$date->add(new DateInterval('P1W')); 
$d2=$date->format('Y-m-d'); 
$sql='SELECT * FROM myTable WHERE date >= ? AND date < ?'; 
+0

MySQL은 differntly 당신이 그것을 전달하는 모드에 따라 주 수를 처리 (http://dev.mysql.com/doc/ [주 (날짜, 모드)를 참조] refman/5.5/ko/date-and-time-functions.html # function_week) 시스템 변수에서이 서버 전체를 설정할 수도 있습니다. – fiz

+0

39 개 미만의 기록이 있습니까? 아마도 WHERE 조건은'date <=? '여야합니다. – BellevueBob

+0

@fiz WEEK()이 다른 모드를 가지는 방식을 보았지만 어떻게 도움이 될지 확신하지 못했습니다. – user1032531

답변

11

당신은 MySQL이 다른 결과를 생성 할 수 있습니다 주 관련 기능에 대한 다양한 모드를 가지고, 어떻게 작동하는지에 관하여 올바른 궤도에 있습니다. http://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html#function_week

그것은 나의 이해 PHP의 날짜 로직에 해당 모드 3이 주 월요일에 시작하고 주 1-53으로 번호가 http://en.wikipedia.org/wiki/ISO_week_date

표준 ISO 주 날짜가있는 MySQL의 모드입니다.

따라서 PHP 호환 값을 얻으려면 WEEK(date_field, 3)을 사용해야합니다.

다른 방법으로 다른 날짜 범위 또는 집계 (Q1-Q4, H1-H2 등)에서 유연하게 쿼리 할 수있는 기능이 필요한 경우 또는 필요한 경우에 유용 할 수 있습니다. PHP가 지원하는 것과 다른 주를 활용하는 것은 MySQL에서 날짜 도우미 테이블을 사용하는 것입니다 (익숙한 사용자는 데이터웨어 하우스의 날짜 차원 테이블로 사용할 수있는 것과 비슷합니다). 날짜 범위를 찾기 위해 합류하기 편리한 테이블을 제공 할 수 있습니다. 이런 식으로 뭔가 작동합니다 :

http://databobjr.blogspot.com/2012/06/create-date-dimension-table-in-mysql.html

+0

아하, 나는 가까이 가고 있었다. 나는 모드 3을 체크 아웃 할 것이다! – user1032531

+0

당신은 마이크입니다! 완벽하게 작동합니다. – user1032531