[SQL] 날짜 비교 비정상적인 결과를 반환 - SQL 오라클
SQL날짜 비교 비정상적인 결과를 반환 - SQL 오라클
나는 구조의 테이블이 있습니다 :
+---------+--------------+-----------------+---------------+-------+------+ | week_no | long_week_no | week_start_date | week_end_date | month | year | +---------+--------------+-----------------+---------------+-------+------+ | 1 | 1A | 01/01/2015 | 03/01/2015 | JAN | 2015 | | 1 | 1B | 04/01/2015 | 10/01/2015 | JAN | 2015 | | 2 | 2 | 11/01/2015 | 17/01/2015 | JAN | 2015 | | 3 | 3 | 18/01/2015 | 24/01/2015 | JAN | 2015 | | .. | .. | .. | .. | .. | .. | | 51 | 51 | 14/12/2014 | 20/12/2015 | DEC | 2014 | +---------+--------------+-----------------+---------------+-------+------+
나는 다음 문을 실행하는 경우 :
SELECT *
FROM loy_period
WHERE To_date('15/04/2015', 'DD/MM/YYYY') BETWEEN
To_date(week_start_date, 'DD/MM/YYYY') AND
To_date(week_end_date, 'DD/MM/YYYY');
과
SELECT *
FROM loy_period
WHERE To_date('15/04/2015', 'DD/MM/YYYY') BETWEEN
week_start_date AND
week_end_date;
그것은 다음을 반환합니다 :
+---------+--------------+-----------------+---------------+-------+------+ | week_no | long_week_no | week_start_date | week_end_date | month | year | +---------+--------------+-----------------+---------------+-------+------+ | 51 | 51 | 14/12/2014 | 20/12/2015 | DEC | 2014 | | 1 | 1A | 01/01/2015 | 03/01/2015 | JAN | 2015 | +---------+--------------+-----------------+---------------+-------+------+
내가 어떤 날짜를 실행할 때, 그것은 week_no (51) 기록에 추가하여 정확한 기간을 반환합니다!
이런 일이 왜 혼란스러워하고 있습니다. 모두 열 WEEK_START_DATE 및 유형 날짜 week_end_date.
예상대로 바이올린 작동합니다.
해결법
-
==============================
1.그것은 TO_DATE 및 DATE 값의 적절한 사용과 나를 위해 완벽하게 작동합니다.
그것은 TO_DATE 및 DATE 값의 적절한 사용과 나를 위해 완벽하게 작동합니다.
무슨 일을 참조하십시오 :
SQL> explain plan for select * from dual where to_date(sysdate) > to_date(sysdate -1); Explained. SQL> select * from table(dbms_xplan.display); PLAN_TABLE_OUTPUT -------------------------------------------------------------------------------- Plan hash value: 3752461848 --------------------------------------------------------------------------- | Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time | --------------------------------------------------------------------------- | 0 | SELECT STATEMENT | | 1 | 2 | 2 (0)| 00:00:01 | |* 1 | FILTER | | | | | | | 2 | TABLE ACCESS FULL| DUAL | 1 | 2 | 2 (0)| 00:00:01 | --------------------------------------------------------------------------- Predicate Information (identified by operation id): PLAN_TABLE_OUTPUT -------------------------------------------------------------------------------- --------------------------------------------------- 1 - filter(TO_DATE(TO_CHAR(SYSDATE@!))>TO_DATE(TO_CHAR(SYSDATE@!-1))) 14 rows selected. SQL>
필터는 그래서, 실제 필터가 적용 (TO_DATE (TO_CHAR (SYSDATE @!)) 당신 때문에 로케일 고유의 NLS 형식을 기반으로 암시 적 변환에 잘못된 출력을 얻을 것이다.
어쨌든, 이제 원래의 질문으로 돌아오고.
예를 들어,
이제 데이터 외모와 같은 가정 해 봅시다 :
설정:
SQL> CREATE TABLE t 2 (week_no VARCHAR2(2), long_week_no VARCHAR2(2), week_start_date DATE, week_end_date DATE, mnth VARCHAR2(3), yr VARCHAR2(4)) 3 ; Table created. SQL> SQL> SQL> INSERT ALL 2 INTO t (week_no, long_week_no, week_start_date, week_end_date, mnth, yr) 3 VALUES ('1', '1A', TO_DATE('01/01/2015','DD/MM/YYYY'), TO_DATE('03/01/2015','DD/MM/YYYY'), 'JAN', '2015') 4 INTO t (week_no, long_week_no, week_start_date, week_end_date, mnth, yr) 5 VALUES ('1', '1B', TO_DATE('04/01/2015','DD/MM/YYYY'), TO_DATE('10/01/2015','DD/MM/YYYY'), 'JAN', '2015') 6 INTO t (week_no, long_week_no, week_start_date, week_end_date, mnth, yr) 7 VALUES ('2', '2', TO_DATE('11/01/2015','DD/MM/YYYY'), TO_DATE('17/01/2015','DD/MM/YYYY'), 'JAN', '2015') 8 INTO t (week_no, long_week_no, week_start_date, week_end_date, mnth, yr) 9 VALUES ('3', '3', TO_DATE('18/01/2015','DD/MM/YYYY'), TO_DATE('24/01/2015','DD/MM/YYYY'), 'JAN', '2015') 10 INTO t (week_no, long_week_no, week_start_date, week_end_date, mnth, yr) 11 VALUES ('51', '51', TO_DATE('20/12/2014','DD/MM/YYYY'), TO_DATE('26/12/2015','DD/MM/YYYY'), 'DEC', '2014') 12 SELECT * FROM dual 13 ; 5 rows created. SQL> SQL> COMMIT; Commit complete. SQL>
표:
SQL> SELECT * FROM t; WE LO WEEK_STAR WEEK_END_ MNT YR -- -- --------- --------- --- ---- 1 1A 01-JAN-15 03-JAN-15 JAN 2015 1 1B 04-JAN-15 10-JAN-15 JAN 2015 2 2 11-JAN-15 17-JAN-15 JAN 2015 3 3 18-JAN-15 24-JAN-15 JAN 2015 51 51 20-DEC-14 26-DEC-15 DEC 2014 SQL>
쿼리 날짜 범위에 따라 행을 필터링합니다 :
SQL> SELECT * 2 FROM t 3 WHERE To_date('15/01/2015', 'DD/MM/YYYY') BETWEEN 4 week_start_date AND 5 week_end_date; WE LO WEEK_STAR WEEK_END_ MNT YR -- -- --------- --------- --- ---- 2 2 11-JAN-15 17-JAN-15 JAN 2015 51 51 20-DEC-14 26-DEC-15 DEC 2014 SQL>
from https://stackoverflow.com/questions/29558899/date-comparison-returns-unusual-result-sql-oracle by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] 룸 예약 쿼리 (0) | 2020.06.18 |
---|---|
[SQL] 어떻게 CodeIgniter의의 활동 기록에이 SQL을 다시 작성할 수 있습니까? (0) | 2020.06.18 |
[SQL] 이동 세포는 왼쪽이 null이 포함 된 경우 SQL에서 왼쪽과 오른쪽 값을 포함 (0) | 2020.06.18 |
[SQL] SQL의 평균을 반올림 때 어떻게 소수를 검색 할 (0) | 2020.06.17 |
[SQL] 특정 테이블을 참조하는 모든 저장 프로 시저를 식별하는 방법 (0) | 2020.06.17 |