2011-06-10 5 views
3

이것은 another question에 후속,하지만 난 영장이 자신의 질문에 생각 :TIMESTAMPDIFF에서 필드를 '단위'로 사용할 수 있습니까?

내가 TIMESTAMPDIFF()의 '단위'매개 변수로 필드를 사용할 수 있습니까? 나는 그것을 실행할 때

SELECT foo FROM table t LEFT JOIN frequencies f USING (frequency_id) 
WHERE MOD(TIMESTAMPDIFF(f.frequency_code, t.date, NOW()), t.frequency_num) = 0 

이 구문 오류를 가져옵니다

예를 들어, 여기에 조각입니다. 이제 f.frequency_code을 실제 단어 - MINUTE, DAY 등으로 바꾸면 작동합니다. 그러나 그것들은 정확하게 현재 f.frequency_code에 포함 된 단어입니다.

해당 위치에서 테이블 필드를 사용할 수 없습니까?

+0

, 나는 어떤을 추측 않을거야 - 당신이 구문 오류가 발생하는 경우 , 분명히 mysql은 그 자리에서 fieldname을 얻으려고하지 않는다. 한 가지 가능한 대안은 간격 이름을 반환하는 하위 쿼리를 시도하는 것입니다.하지만 그 중 하나가 작동하지 않을지는 의심 스럽습니다. 대부분의 MySQL 파서는 리터럴 간격 이름과 그 리터럴 간격 이름 만 찾길 기대하고 있습니다. –

+0

당신은 항상 중첩 된'IF' 구조로 작업 할 수 있습니다. 그러나 그것은 끔찍한 코드를 생성 할 것입니다. 무슨 일이 일어나는지 보길 원합니다 - 가능하지는 않지만 가능합니다. –

답변

6

TIMESTAMPDIFF()은 그런 동적 단위를 지원하지 않습니다.

알려진 단위 집합으로 작업 중이므로 CASE 문을 사용하면됩니다.

귀하의 예제 쿼리를 시작으로,이 같은 아마 작동합니다 : 진정으로 허용 무엇을 볼 수있는 MySQL의 소스에보고하지 않고

SELECT foo 
FROM table t 
LEFT JOIN frequencies f USING (frequency_id) 
WHERE MOD(
(CASE 
    WHEN f.frequency_code = 'MICROSECOND' THEN TIMESTAMPDIFF(MICROSECOND, t.date, NOW()) 
    WHEN f.frequency_code = 'SECOND' THEN TIMESTAMPDIFF(SECOND, t.date, NOW()) 
    WHEN f.frequency_code = 'MINUTE' THEN TIMESTAMPDIFF(MINUTE, t.date, NOW()) 
    WHEN f.frequency_code = 'HOUR' THEN TIMESTAMPDIFF(HOUR, t.date, NOW()) 
    WHEN f.frequency_code = 'DAY' THEN TIMESTAMPDIFF(DAY, t.date, NOW()) 
    WHEN f.frequency_code = 'WEEK' THEN TIMESTAMPDIFF(WEEK, t.date, NOW()) 
    WHEN f.frequency_code = 'MONTH' THEN TIMESTAMPDIFF(MONTH, t.date, NOW()) 
    WHEN f.frequency_code = 'QUARTER' THEN TIMESTAMPDIFF(QUARTER, t.date, NOW()) 
    WHEN f.frequency_code = 'YEAR' THEN TIMESTAMPDIFF(YEAR, t.date, NOW()) 
    END) 
, t.frequency_num) = 0 
+0

코드가 추한 코드처럼 보일 수도 있지만,이 방법은 제가 사용했던 방법입니다. 감사! – Andrew

0

아니요 100 % 아니지만 을 준비하고 실행하는 creating a function으로 문제를 해결할 수 있습니다.

+0

시도하지만 취하고 싶지 않습니다. 그래도 좋은 생각이야. – Andrew

관련 문제