복붙노트

[SQL] 오라클 SQL에서 날짜 비교

SQL

오라클 SQL에서 날짜 비교

나는 'CREATION_DATE'나는 6 개 기록을 얻고에 따라 별개의 기록을 위해 내 테이블을 쿼리하고 때 나는, 유형 '날짜'입니다 열 'CREATION_DATE'를 가지고 :

select distinct creation_date from test_table;

산출:

06-APR-11
06-APR-11
28-MAR-11
06-APR-11
06-APR-11
18-MAR-11

이 출력 6 년 4 월 내가 내 쿼리에 별개의 사용도 4 번 표시됩니다. 또한 나는 2011년 4월 6일 내가 어떤 결과를 얻고 있지 않다의 CREATION_DATE와 일치하는 모든 레코드를 찾기 위해 노력하고 있습니다 때. 다음은 내 쿼리는 다음과 같습니다

select * from  test_table where creation_date = to_date('06-APR-11','DD-MON-YY');

나는이 두 쿼리에 잘못을하고있는 중이 야 어디 제발 도와주세요.

해결법

  1. ==============================

    1.문제는 두 가지이다. 첫째 날짜는 거의 확실히 시간을 가지고있다. TO_DATE ('06 -3은-11 ','DD-MON-YY ')가 2011년 3월 6일 00:00:00 동등하다. 당신이)합니다 (TRUNC를 사용하는 경우 당신이 그 일에 대한 모든 것을 볼 수있을 것입니다 기능 :

    문제는 두 가지이다. 첫째 날짜는 거의 확실히 시간을 가지고있다. TO_DATE ('06 -3은-11 ','DD-MON-YY ')가 2011년 3월 6일 00:00:00 동등하다. 당신이)합니다 (TRUNC를 사용하는 경우 당신이 그 일에 대한 모든 것을 볼 수있을 것입니다 기능 :

    select * 
      from test_table
     where trunc(creation_date) = to_date('06-MAR-11','DD-MON-YY');
    

    나는 월의 날짜 형식 모델을 사용하지 않을 것입니다. 여기 설명으로는 지역 및 설정에 따라 달라집니다. 대신 숫자 월 형식 모델을 사용하는 것이 안전합니다. 마찬가지로, 항상 올해의 일부로서 세기를 지정합니다.

    where trunc(creation_date) = to_date('06-03-YY11','DD-MM-YYYY');
    

    두 번째 문제는 거의 확실히 당신의 NLS_DATE_FORMAT이다; 당신이 4 동일한 날짜를 볼 이유 때문에, 계정에 시간을 갖지 것으로 보인다. 이것은 단지 데이터가 저장되어 있지 어떻게 표시되는 방식을 제어합니다.

    당신은 같은 사용하여이 뭔가를 변경할 수 있습니다 :

    ALTER SESSION SET NLS_DATE_FORMAT = "DD/MM/YYYY HH24:MI:SS"
    

    나는 다음을 사용하여 테스트 환경을 설정하는 경우 :

    create table test_table ( creation_date date );
    insert into test_table values ( sysdate );
    insert into test_table values ( sysdate - 0.01 );
    alter session set nls_date_format = "YYYY/MM/DD";
    

    당신은 (SYSDATE는 않습니다하지만) 시간은 포함되지 않습니다 반환 된 데이터를 볼 수 있습니다 :

    SQL> select * from test_table;
    
    CREATION_D
    ----------
    2013/04/12
    2013/04/12
    

    NLS_DATE_FORMAT을 변경하면 동일한 SELECT를 수행, 당신은 지금 시간 구성 요소를 얻을 :

    SQL> alter session set nls_date_format = "YYYY/MM/DD HH24:MI:SS";
    
    Session altered.
    
    SQL> select * from test_table;
    
    CREATION_DATE
    -------------------
    2013/04/12 12:48:41
    2013/04/12 12:34:17
    

    혼자 오늘의 날짜를 선택하려고 할 때 마지막 행이 반환되지 않습니다 :

    SQL> select *
      2    from test_table
      3   where creation_date = to_date('20130412','yyyymmdd');
    
    no rows selected
    

    TRUNC를 사용하지만, () 다시 모든 행을 얻을 필드의 날짜 부분을에 비교 :

    SQL> select *
      2    from test_table
      3   where trunc(creation_date) = to_date('20130412','yyyymmdd');
    
    CREATION_DATE
    -------------------
    2013/04/12 12:48:41
    2013/04/12 12:34:17
    

    실제로 당신이 고유 한 날짜를 원하는 경우가 TRUNC () 함수를 다시 사용할 수 있습니다, 두 번째 질문에 대답하려면 :

    select distinct trunc(creation_date)
      from test_table
    
  2. ==============================

    2.날짜 데이터 형식 저장 (세기 포함) 년, 월, 일, 시간, 분, 및 (자정 이후) 초. 또한이를 고려해야합니다.

    날짜 데이터 형식 저장 (세기 포함) 년, 월, 일, 시간, 분, 및 (자정 이후) 초. 또한이를 고려해야합니다.

  3. from https://stackoverflow.com/questions/15970277/comparing-with-date-in-oracle-sql by cc-by-sa and MIT license