복붙노트

[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. ==============================

    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>
    
  2. from https://stackoverflow.com/questions/29558899/date-comparison-returns-unusual-result-sql-oracle by cc-by-sa and MIT license