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
'source' 카테고리의 다른 글
우커머스에서 행당 상품 수 변경 (0) | 2023.09.28 |
---|---|
저장 프로시저는 두 행을 업데이트합니다. (0) | 2023.09.28 |
XAMPP 폴더에서 MySQL 데이터베이스 테이블의 정확한 위치는 무엇입니까? (0) | 2023.09.28 |
: : : (0) | 2023.09.28 |
도커 컨테이너의 파일 시스템 탐색 (0) | 2023.09.28 |