2016-09-06 2 views
0

datetime 필드의 출력을 수정하여 해당 날짜가 속하는 요일을 반환해야합니다. 예를 들어, 날짜가 9/2/2016 인 경우 해당주의 월요일 (일요일이 아닌 월요일)이되기 때문에 2016 년 8 월 29 일을 반환해야합니다. 그러나 타임 스탬프를 다른 시간대로 변환해야합니다. 시간대 변환 결과에 영향을 미칠 수 있기 때문에 결과에 시간대를단일 SELECT 문에서 같은 값의 계산을 두 번 수행하지 않음

CONVERT_TZ(timestamp, '+00:00', '+05:00') - INTERVAL WEEKDAY(CONVERT_TZ(timestamp, '+00:00', '+05:00')) day 

나는 단순히 UTC의 날짜에 INTERVAL 계산을 수행 할 수 없습니다 다음 변환 : 결과는 내가 두 번 시간대를 변환하는 데 끝날 것입니다 WEEKDAY 함수, 예 : 2016-9-5 00:00 UTC의 datetime은 실제로 EST의 경우 9/4에 해당하므로 다른 요일의 일부가됩니다.

문에 CONVERT_TZ을 두 번 호출하지 않아도되는 방법이 있습니까?

답변

1

하위 쿼리에 넣을 수 있습니다.

SELECT converted - INTERVAL WEEKDAY(converted) AS day 
FROM (SELECT CONVERT_TZ(timestamp, '+00:00', '+05:00') AS converted 
     FROM yourTable) AS x 

또 다른 방법은 사용자 변수를 할당하는 것입니다. 두 번 사용할 수 있으려면 IF() 표현식의 조건 부분에 할당을 지정합니다. 할당 전에 사용이 완료되도록합니다.

IF(@converted := CONVERT_TZ(timestamp, '+00:00', '+05:00'), 
    @converted - INTERVAL(WEEKDAY(@converted) DAY, 
    NULL) AS day 
+0

분명히 한 가지 방법이지만 현재 쿼리보다 성능이 훨씬 떨어집니다. 이미 하위 쿼리를 사용하고 있다면이 옵션이 좋습니다. – maxedison

+0

다른 방법으로 사용자 정의 변수를 사용하여이를 수행하십시오. – Barmar

+0

흥미 롭습니다. 실제로 이것을 권유 해 주시겠습니까? 아니면 제가 가지고있는 것을 고수해야합니까? – maxedison

관련 문제