2014-07-25 3 views
2

"Google 애널리틱스"작업을 수행해야하는 스크립트가 있습니다. 기본적으로 사용자의 방문자 통계를 표시합니다.MySQL에서 시간대를 처리하는 방법은 무엇입니까?

보고서를 요청한 사용자의 시간대로 보고서를 생성하려고합니다.

지금까지 나는이와 코드를 작성했습니다 :

SET time_zone = timezone; 

은 무엇을 각 MySQL의 연결 당 시간대를 설정합니다. 사용자가 timestamp으로 데이터를 검색하면 타임 스탬프가 연결 시간대로 변환됩니다. 나는 UTC를 타임 스탬프에 저장하고있다.

모든 것이 제대로 작동하는 것 같습니다. 그러나 어떤 사람들은 이것이 잘못된 접근이라고 말하고 있습니다. 여러 사용자가 서로 다른 time_zone 설정을 사용하여 데이터베이스에 연결할 수 없기 때문입니다.

그러나 MySQL doc는 말한다 :

당 연결 시간대. 연결하는 각 클라이언트에는 time_zone 세션의 세션에 의해 지정된 자체 시간대 영역 설정이 있습니다. 처음에는 세션 변수는 글로벌 TIME_ZONE 변수 에서 그 값이 필요하지만 클라이언트는 그들이 당신의 MySQL의 시간대에서와 아무것도 안된다는 주장을 계속하지만이 문장

와 함께 자신의 시간대를 변경할 수 있습니다 모든. 당신은 (예를 들어) PHP 코드에서이 모든 작업을 수행해야합니다. Here이 답변과 비슷한 질문입니다.

하지만 PHP 코드에서 어떻게 할 수 있습니까? 나는 PHP에서 시간대를 사용하여 시간을 변환하는 방법을 알고 있지만 단일 행을 가져 오는 것과는 다릅니다.

은 내가 timestamp 필드에 날짜를 기준으로 행과 그룹을 수천 검색 오전 :

SELECT ... 
FROM logs 
WHERE 
user_id = :user_id 
AND timestamp >= CURDATE() 
GROUP BY DATE(timestamp) 

내가 수백만을 가지고 있기 때문에 MySQL은 타임 스탬프의 인덱스를 사용하는 것이 매우 중요합니다. 타임 스탬프에 함수를 사용하고 있는데도 인덱스가 작동합니까? GROUP BY DATE(timestamp)? 그렇지 않으면 내가 어떻게 할 수 있겠는가?

그럼 어떻게해야합니까? 나는 충고에 대해 정말로 감사 할 것입니다.

+1

으로 변환 될 수 있습니다. 클라이언트의 타임 스탬프는 이미 gmt로 변환되어야합니다. 런던에있는 컴퓨터와 홍콩에있는 컴퓨터의 타임 스탬프는 해당 지역 시간이 같지 않아도 동일해야합니다. 그것은 무엇을해야하는지 명확히하는 데 도움이됩니까? 기본적으로, 아무것도. 클라이언트는 엉성한 작업을해야합니다. – Octopus

+0

DB에서 할 수있는 유일한 일은 모든 데이터가 저장되는 표준 시간대 (아마도 UTC)를 정의하는 것입니다. PHP로 변환하십시오. – ToBe

답변

0

사용자가 모든 타임 스탬프를 tz로 변환하고 timestamp (* user)> = CURDATE (* user)를 사용합니다. 나는 다른 방법은

convert timestamp(user) to timestamp(server) 

로 생각하고

timestamp(*server) >= CURDATE(*server) 

예를

dates =(5,6,7) 

dates-2 = (3,4,5) (이 배열에 직접 제한 확인) (내 TZ로 변환) biggerThan3 결과를 사용 = (4,5) 두 번째 방법 (제한 조건을 TS 서버로 변환) biggerThan3 -> biggerThan(3+2)5 (서버 배열의 제약 조건 확인) dates =(5,6,7) result=(6,7) 결과는 (4,5)

관련 문제