2016-06-21 3 views
0

저는 현재 UTC로 내 datetimes를 저장하고 있으며, 모든 목적을 위해, 지금까지 잘 작동합니다. 하지만 이제는 오늘과 같이 특정 날짜에 만든 레코드를 동부 표준 시간대에 쿼리하려고합니다.MySQL - "오늘"만든 레코드에 대한 쿼리가 있습니다. 날짜는 UTC입니다.

시간의 차이로 인해 현재 작성중인 레코드에 내일 날짜가 표시됩니다. 예를 들어, 현재 시간대는 2016-06-20이지만 UTC는 2016-06-21입니다.

레코드를 UTC로 저장하면 내 자신의 시간대로 특정 날짜의 레코드를 어떻게 정확하게 얻을 수 있습니까? 나는 convert_tz 함수를 사용하여 저장된 값을 Eastern으로 변환하고이를 내 where 절의 일부로 사용할 수 있다고 생각했습니다. 그런 식으로 날짜가 일치합니다. 그게 믿을만한 해결책입니까?

+3

적절할 경우 질문 기록을 방문하고 답변을 받기 시작할 수 있습니다. 그것은 대답하기를 원하는 누구에게나 유망한 시력이 아닙니다. – Drew

+0

이해합니다. 알림을 보내 주셔서 감사합니다. – kenshin9

답변

1

은 UTC으로 검색하는 날짜 경계를 변환합니다.

CONVERT_TZ 기능이 편리합니다. 이런 식으로 뭔가 :

WHERE my_utc_date_time_col >= CONVERT('2016-02-20','EST5EDT','+00:00') 
    AND my_utc_date_time_col < CONVERT('2016-02-20','EST5EDT','+00:00') + INTERVAL 1 DAY 

(이것은 당신이, MySQL의 시간대 테이블을 채워했습니다 그래서 이름이 시간대가 지원한다고 가정합니다.)

효과적으로 상당 바람이 :

WHERE my_utc_date_time_col >= '2016-02-20' + INTERVAL 4 HOUR 
    AND my_utc_date_time_col < '2016-02-20' + INTERVAL 4 HOUR + INTERVAL 1 DAY 

또는

WHERE my_utc_date_time_col >= '2016-02-20 04:00:00' 
    AND my_utc_date_time_col < '2016-02-21 04:00:00' 

당신은 함수를 참조하려면 다음과 같은 NOW() 현재 날짜를 얻으려면 MySQL 연결의 시간대가 중요합니다. 반환되는 datetime 값은 MySQL 연결의 time_zone에 있기 때문입니다. 우리의 문자 측면보다는 열에서 변환을 수행하는 것을 선호

SHOW VARIABLES LIKE 'time_zone' ; 

참고 때문에 우리는 의 모든 행에 대해 변환을 수행하기 위해 MySQL을 강제 컬럼에 그것을 할 경우 테이블을 만들고 리터럴을 비교합니다.리터럴 측에서 변환을 수행하면 MySQL이 인덱스 범위 스캔 작업 (적절한 인덱스를 사용할 수 있음)을 효과적으로 사용할 수 있습니다.

+0

입력 해 주셔서 감사합니다. 내가 언급 한 것과 비슷한 것을했기 때문에 문자 그대로의 측면에서 변환을 수행하고이를 열과 비교합니다. – kenshin9

0

CONVERT_TZ 기능이 실제로 필요한 것입니다. 그러나 나는 동의하지 않는다 :

나는 convert_tz 함수를 사용하여 저장된 값을 Eastern으로 변환하고이를 내 where 절의 일부로 사용할 수있다. WHERE에 기능을 사용하면 성능이 저하 될 수 있기 때문에

.

저장 프로 시저를 사용하는 경우 먼저 입력 날짜를 변환 한 다음 SELECT 문에 사용하는 것이 좋습니다. 그것은 다음과 같이 보일 것입니다 :

SET @fromDate = CONVERT_TZ(@fromDate, ...) --Convert to UTC 
SET @toDate = CONVERT_TZ(@toDate, ...) --Convert to UTC 

SELECT * 
    FROM TableA A 
    WHERE A.FromDate BETWEEN @fromDate AND @toDate 
0

http://ee1.php.net/manual/en/class.datetime.php

$foo = new DateTime("today", new DateTimeZone("America/Vancouver")); 
var_dump($foo->format('c'), $foo->format('U')); 
$foo->setTimeZone(new DateTimeZone("UTC")); 
var_dump($foo->format('c'), $foo->format('U'), $foo->format('Y-m-d H:i:s')); 

출력 :

string(25) "2016-06-20T00:00:00-07:00" 
string(10) "1466406000" 
string(25) "2016-06-20T07:00:00+00:00" 
string(10) "1466406000" 
string(19) "2016-06-20 07:00:00"