mysql - with - postgresql timestamp size




mySQL의 PostgreSQL의 date_trunc (2)

최근 PostgreSQL (8.2 사용)에 익숙해졌으며 date_trunc 함수가 특정 날짜 / 월 / 일 사이의 시간 스탬프를 쉽게 매칭하는 데 매우 유용하다는 것을 알게되었습니다. 함수의 진정한 유용성은 출력이 타임 스탬프 형식으로 유지된다는 사실에서 비롯된 것이라고 생각합니다.

필자는 mySQL (5.0)으로 전환하고 비교 대상이 아닌 일부 날짜 기능을 찾아야했습니다. 추출 함수가 유용하게 보이고 발견 한 날짜 함수가 내 문제 중 일부를 해결하지만 PostgreSQL의 date_trunc를 복제 할 수있는 방법이 있습니까?

다음은 date_trunc를 사용하여 쿼리 된 타임 스탬프를 현재 달을 포함하여 최근 4 개월 만 일치시키는 방법을 사용한 예입니다. 단, 한 달이 이미 이번 달에 전달 된 경우에만 가능합니다.

WHERE date_trunc('month', QUERY_DATE) BETWEEN 
    date_trunc('month', now()) - INTERVAL '4 MONTH' AND 
    date_trunc('month', now() - INTERVAL '1 WEEK')

mySQL에서 이와 같은 규정을 어떻게 재현해야할지 모르겠습니다. 그래서, 하루가 끝날 무렵의 제 질문은이 유형의 쿼리가 mySQL에서 replicate date_trunc (및 방법)를 시도하여 수행 할 수 있는지 여부 또는 이러한 유형의 쿼리를 다른 방식으로보고 시작할 필요가 있는지 여부입니다 mySQL에서 (그리고 그렇게하는 방법에 대한 제안)?


추출 함수가 유용하게 보이고 발견 한 날짜 함수가 내 문제 중 일부를 해결하지만 PostgreSQL의 date_trunc를 복제 할 수있는 방법이 있습니까?

실제로 EXTRACT 는이 특정 사례에 가장 근접한 것으로 보입니다.

PG의 원래 코드 :

WHERE date_trunc('month', QUERY_DATE) BETWEEN 
    date_trunc('month', now()) - INTERVAL '4 MONTH' AND 
    date_trunc('month', now() - INTERVAL '1 WEEK')

EXTRACT 사용 :

WHERE EXTRACT(YEAR_MONTH FROM QUERY_DATE)
      BETWEEN
          EXTRACT(YEAR_MONTH FROM NOW() - INTERVAL 4 MONTH)
      AND
          EXTRACT(YEAR_MONTH FROM NOW() - INTERVAL 1 WEEK)

기능적으로 동일해야하지만 비교를하기 전에 날짜를 YYYYMM 문자열로 변경하는 것입니다.

또 다른 옵션은 DATE_FORMAT 을 사용하여 날짜 문자열을 재 작성하고이를 월 초에 강제 적용하는 것입니다.

WHERE DATE_FORMAT(QUERY_DATE, '%Y-%m-01')
      BETWEEN
          DATE_FORMAT(NOW() - INTERVAL 4 MONTH, '%Y-%m-01')
      AND
          DATE_FORMAT(NOW() - INTERVAL 1 WEEK, '%Y-%m-01')

또한, MySQL은 필드가 인덱싱 된 경우에도 날짜 범위를 다루는 데 정말로 열악하다는 것을 알아 두십시오. 조심하지 않으면 전체 테이블 스캔으로 끝날 것입니다.


파티에 늦었지만 ...

간격을 알면 절단 된 날짜를 가져 오는 방법이 있습니다. 예를 들어 간격이 MONTH 인 경우 다음을 사용하여 오늘 날짜를 잘라낼 수 있습니다 ( now() ).

select date_add('1900-01-01', interval TIMESTAMPDIFF(MONTH, '1900-01-01', now()) MONTH);

위의 것을 감안할 때 다른 간격도 처리하는 함수를 만들 수 있습니다.

DELIMITER //
create function date_trunc(vInterval varchar(7), vDate timestamp)
returns timestamp
begin
    declare toReturn timestamp;

    if vInterval = 'year' then set toReturn = date_add('1900-01-01', interval TIMESTAMPDIFF(YEAR, '1900-01-01', vDate) YEAR);
    elseif vInterval = 'quarter' then set toReturn = date_add('1900-01-01', interval TIMESTAMPDIFF(QUARTER, '1900-01-01', vDate) QUARTER);
    elseif vInterval = 'month' then set toReturn = date_add('1900-01-01', interval TIMESTAMPDIFF(MONTH, '1900-01-01', vDate) MONTH);
    elseif vInterval = 'week' then set toReturn = date_add('1900-01-01', interval TIMESTAMPDIFF(WEEK, '1900-01-01', vDate) WEEK);
    elseif vInterval = 'day' then set toReturn = date_add('1900-01-01', interval TIMESTAMPDIFF(DAY, '1900-01-01', vDate) DAY);
    elseif vInterval = 'hour' then set toReturn = date_add('1900-01-01', interval TIMESTAMPDIFF(HOUR, '1900-01-01', vDate) HOUR);
    elseif vInterval = 'minute' then set toReturn = date_add('1900-01-01', interval TIMESTAMPDIFF(MINUTE, '1900-01-01', vDate) MINUTE);
    END IF;

    return toReturn;
end//
DELIMITER ;

다음과 같이 사용하십시오.

select date_trunc('quarter', now())




postgresql