source

Oracle to_date 함수 테스트

manycodes 2023. 9. 28. 08:36
반응형

Oracle to_date 함수 테스트

GORM을 이용하여 성배에서 통합 테스트를 작성하고 있습니다.

저는 다음과 같은 일을 하고 싶습니다.

delete from Statistic 
where stat_date = TO_DATE(:month_year, 'MON-YYYY')

하지만 다음과 같은 오류가 발생합니다.

java.sql.SQL 예외:예기치 않은 토큰: 문의 TO_DATE [stat_date=가 있는 통계에서 삭제합니다.TO_DATE(? 'MON-YYY')]

TO_date 함수를 지원하지 않는 GORM에서 사용하는 in memory database(H2인가요?)로 인해 오류가 발생한 것 같습니다.

테스트 및 라이브에서 작동하도록 삭제 SQL을 작성하는 방법에 대한 아이디어가 있습니까?

저는 월과 연도에만 관심이 있기 때문에 stat_date가 해당 월의 첫 번째 날짜와 마지막 날짜 사이에 있는 레코드를 삭제해야 한다고 생각했습니다.

누가 더 좋은 방법을 생각해 낼 수 있습니까?

이것은 여전히 구글 검색에서 1위로 뜨기 때문에 저에게 효과가 있었던 것은 다음과 같습니다.

내 유닛은 sql 파일을 사용하여 스키마를 만들고 채우는 테스트/로컬 환경을 테스트합니다.sql 파일에 다음 별칭을 만들었습니다.

-- TO_DATE 
drop ALIAS if exists TO_DATE; 
CREATE ALIAS TO_DATE as '
import java.text.*;
@CODE
java.util.Date toDate(String s, String dateFormat) throws Exception { 
  return new SimpleDateFormat(dateFormat).parse(s); 
} 
';

h2 사용자 정의 함수에서 $$가 아닌 단일 인용문을 사용하는 것이 저에게 유일하게 적합한 형식입니다.

저희 Oracle sql에서 일반적으로 사용되는 날짜 형식에 적합하도록 bluesman의 답변을 조정해야 했습니다.

이 버전은 'DD-MON-YYYY'와 같은 dateFormat을 지원합니다.

-- TO_DATE
drop ALIAS if exists TO_DATE;
CREATE ALIAS TO_DATE as '
import java.text.*;
@CODE
java.util.Date toDate(String s, String dateFormat) throws Exception {
  if (dateFormat.contains("MON")) {
      dateFormat = dateFormat.replace("MON", "MMM");
  }
  if (dateFormat.contains("Y")) {
      dateFormat = dateFormat.replaceAll("Y", "y");
  }
  if (dateFormat.contains("D")) {
      dateFormat = dateFormat.replaceAll("D", "d");
  }
  return new SimpleDateFormat(dateFormat).parse(s);
}
';

저는 이 블로그 포스트 http://javatechniques.com/blog/dateformat-and-simpledateformat-examples/ 의 팁이 Oracle 날짜 형식을 SimpleDateFormat의 형식으로 변환하는 방법을 이해하는 데 도움이 된다는 것을 알았습니다.

네, H2는 TO_DATE를 지원하지 않으며, 1.4.x 로드맵에 나와 있습니다.대신 Oracle DB와 H2에 모두 존재하는 EXTRECT 기능을 사용할 수 있습니다.

java.util.Date toDate(String dateTime, String dateFormat) throws Exception {
    if (dateFormat.contains("MON")) {
        dateFormat = dateFormat.replace("MON", "MMM");
    }
    if (dateFormat.contains("Y")) {
        dateFormat = dateFormat.replaceAll("Y", "y");
    }
    if (dateFormat.contains("D")) {
        dateFormat = dateFormat.replaceAll("D", "d");
    }
    if (dateFormat.contains("HH")) {
        dateFormat = dateFormat.replaceAll("HH", "hh");
    }
    if (dateFormat.contains("hh24")) {
        dateFormat = dateFormat.replaceAll("hh24", "hh");
    }
    if (dateFormat.contains("MI") || dateFormat.contains("mi")) {
        dateFormat = dateFormat.replaceAll("MI", "mi").replaceAll("mi", "mm");
    }
    if (dateFormat.contains("SS")) {
        dateFormat = dateFormat.replaceAll("SS", "ss");
    }
    return new SimpleDateFormat(dateFormat).parse(dateTime);
}

또는 다음과 같이 자신만의 TO_DATE를 정의할 수 있습니다.

    CREATE ALIAS TO_DATE AS $$
java.util.Date to_date(String value, String format) throws java.text.ParseException {

java.text.DateFormat dateFormat = new  java.text.SimpleDateFormat(format);
    return dateFormat.parse(value);
}
$$;

http://www.h2database.com/html/features.html#user_defined_functions 를 참조하십시오.

언급URL : https://stackoverflow.com/questions/6829703/testing-the-oracle-to-date-function

반응형