티스토리 뷰
검색해보면
reg_date는 datetime형이고, 인덱스가 걸려있다고 가정한다.
1 2 3 4 5 6 7 | SELECT * FROM Test WHERE date_format(reg_date, '%Y-%m-%d') BETWEEN '2013-01-01' AND '2013-01-31'; SELECT * FROM Test WHERE date(reg_date) BETWEEN '2013-01-01' AND '2013-01-31'; | cs |
이렇게 하라고 많이 써있는데,
좋은 글 발견
http://egloos.zum.com/tiger5net/v/5751776
1 2 3 4 | SELECT * from tb_user_logs where log_time >= '2016-07-29' and log_time < '2016-08-01' | cs |
이렇게 짜면 검색속도가 엄청 빠르다고 한다.
분명 pgAdmin에서 쿼리 돌렸을 땐 잘 돌아갔는데?
왜 어? 이클립스에서 오류나지?
Mybatis는 XML에 정의하기 때문에 부등로를 그냥 쓰면 오류가 난다고,
태그에 존재하는 <tag> 꺽쇠랑 동일하여, 파싱에러가 난다고 한다.
<![CDATA[ ]]> 로 감싸주면 해결!
1 2 3 4 5 6 7 8 9 10 11 | SELECT USER_ID, LOG_LEVEL, LOG_MSG, coalesce(to_char(LOG_TIME,'YYYY-MM-DD HH24:MI'),'') LOG_TIME FROM JDN.TB_USER_LOGS <![CDATA[ WHERE LOG_TIME >='2016-07-29' AND LOG_TIME < '2016-08-01' ]]> ORDER BY LOG_TIME DESC | cs |
이제 입력받은 날짜로 제한되어 결과 값이
나와야 하는데 그러면 파라미터를 넘겨받아야겠다.
그때에 이코드가 유용할듯
1 2 3 4 | <![CDATA[ attendance_date >=to_date(#{start_date}, 'YYYY-MM-DD' ) and attendance_date < to_date(#{finish_date}, 'YYYY-MM-DD') ]]> | cs |
참조: http://kmckmc.tistory.com/entry/MyBatis-%EC%82%AC%EC%9A%A9-%EA%B8%B0%EA%B0%84%EA%B2%80%EC%83%89
#@!@$%#$#@!!그런데!
왜 안나와???????????????
내문제다. 내가 잘 몰라서~~~~
나는 기본 초기값을 오늘날짜부터 오늘날짜까지 해서 하루치 리스트를 초기상태로 뿌리고 싶었는데.
저렇게 했을 때 '2016-07-29' 가 시작데이터고, '2016-07-29' 가 끝 데이터 일때 count 가 0으로 나와 리스트가 나오지 않는 문제가 발생했다.
DB에 찍히는 시간 값은 timestamp값이고, VO로 만들어 보내는 값은 String이고
첨에 형이 다르다고 해서 형변환을 했다.
1 2 3 | <![CDATA[ WHERE CAST(LOG_TIME AS CHARACTER VARYING) >= #{fromDate} AND CAST(LOG_TIME AS CHARACTER VARYING)<= #{toDate} ]]> | cs |
근데도 안되
왜????????
봤더니 , DB timestamp에서는 시간 분 초 그이후까지 나오는데, 강제적으로 char형으로 변환시켜놓은것이고
fromDate값으로 들어오는 '2016-07-29' 가 날짜만 가지고 비교를 하니까 기본적으로 000000으로 시간을 임의로 넣었기 때문에
값비교가 안되었던 것이다.(제기랄)
그리고 date format인 컬럼을 to_char(컬럼,'YYYY-MM-DD") 변환 후 변수와 비교할 경우 매 컬럼마다 to_char함수가
실행되기에 컬럼건수가 많을 경우 performence에 영향을 미치게 된다.
차라리 다음과 같은 방법으로 처리하도록 하자.
1. 변수를 to_date함수를 통하여 날짜 형식으로 변환 후 비교한다.
2. Date가 아닌 VARCHAR형식의 컬럼을 추가하고 해당 컬럼에 인덱스를 추가한 다음 변수와 비교하도록 한다.
1 2 3 4 | <![CDATA[ WHERE CAST(LOG_TIME AS CHARACTER VARYING) >= (#{fromDate}||'00:00:00') AND CAST(LOG_TIME AS CHARACTER VARYING)<= ( #{toDate}||'23:59:59') ]]> | cs |
끝
'업무 > SQL' 카테고리의 다른 글
SQL : JOIN / SELF JOIN / OUTER JOIN / RIGHT OUTER JOIN / GROUP BY / HAVING / DISTINCT (0) | 2016.12.01 |
---|---|
SQL : 전체에서 몇개 제외하고 삭제 / MIN() / order by / desc / Mybatis<![CDATA[]]> (0) | 2016.11.30 |
SQL : View 화면 특정값 전부 대소문자 / UPPER / LOWER / INSERT / CASE WHEN / UPDATE (0) | 2016.07.19 |
SQL : if문/ for문 / foreach / trim (0) | 2016.07.19 |
postgreSQL 테이블 생성/제거 (0) | 2016.06.28 |
- Total
- Today
- Yesterday
- java
- 게시판table설계
- c 태그
- windows hyper-v
- 체크박스전체해제
- foreach 배열
- 스크립팅 요소
- 체크박스
- 체크박스전체선택
- String[] 파라미터
- 게시판페이지설계
- Hyper-V
- 윈도우8.1
- 자바
- 이클립스DB연결
- SQL
- servlet
- servlet게시판
- spring
- input[type=text]초기화
- 스프링
- jsp
- input[type=file]초기화
- selectbox에 값 매핑
- jsp 기초 개념
- windows 8.1
- Javascript
- Split
- 자바스크립트
- 제이쿼리
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |