복붙노트

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

SQL

오라클 SQL에서 날짜 비교

나는 그것이 1994년 6월 20일 후 고용 직원의 수를 표시하는 얻으려고 하지만 6 월 '잘못된 식별자 "라는 오류가 발생합니다. 도와주세요, 감사합니다!

Select employee_id, count(*)
From Employee
Where to_char(employee_date_hired, 'DD-MON-YY') > 31-DEC-95; 

해결법

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

    1.31 ~ 12-95 문자열 아니며 6 월 20 - 94이다. 그들은 마지막에 추가 된 몇 가지 여분의 물건 번호입니다. '노트 작은 따옴표 - 이는 '31 -dec-95'또는 '20 -JUN-94 '을해야한다. 이 문자열 비교를 할 수있게된다.

    31 ~ 12-95 문자열 아니며 6 월 20 - 94이다. 그들은 마지막에 추가 된 몇 가지 여분의 물건 번호입니다. '노트 작은 따옴표 - 이는 '31 -dec-95'또는 '20 -JUN-94 '을해야한다. 이 문자열 비교를 할 수있게된다.

    그러나 문자열 비교를 수행하지 않는; 당신은 날짜 비교를하고 있습니다. 당신은 날짜로 문자열을 변환해야합니다. 어느 내장 TO_DATE () 함수 또는 날짜 리터럴을 이용하여.

    select employee_id
      from employee
     where employee_date_hired > to_date('31-DEC-95','DD-MON-YY')
    

    이 방법은 몇 가지 불필요한 함정이있다

    select employee_id
      from employee
     where employee_date_hired > to_date('31-12-1995','DD-MM-YYYY')
    

    날짜 리터럴은 오라클 특정 기능을 사용하지 않아도 의미 ANSI 표준의 일부입니다. 리터럴을 사용할 때의 형식은 YYYY-MM-DD의 날짜를 지정해야합니다 당신은 시간 요소를 포함 할 수 없습니다.

    select employee_id
      from employee
     where employee_date_hired > date '1995-12-31'
    

    시간 부분없이 날짜 1995년 12월 31일 00:00:00 상당하므로 오라클 날짜 데이터 타입은 시간 요소를 포함하는 것을 기억하라.

    MI : 당신이 다음 시간 부분을 포함 할 경우의 형식은 YYYY-MM-DD HH24 소요 시간 소인 문자 그대로 사용해야 할 것 SS [.FF0-9을]

    select employee_id
      from employee
     where employee_date_hired > timestamp '1995-12-31 12:31:02'
    

    NLS_DATE_LANGUAGE은 NLS_LANGUAGE로부터 유도되고 NLS_DATE_FORMAT은 NLS_TERRITORY에서 파생된다. 정말 필요한 경우에만 - - 또는 ALTER SESSION 구문을 사용하여 세션 수준에서 처음 데이터베이스를 만들었지 만 그들은 당신의 inialization 매개 변수 파일을 변경하여 변경 될 수있는 경우이 설정됩니다. 예를 들어 :

    alter session set nls_date_format = 'DD.MM.YYYY HH24:MI:SS';
    

    이 수단 :

    당신은 V $ NLS_VALID_VALUES를 조회하여 V $ NLS_PARAMETERS 및 유효한 값의 전체 범위를 쿼리하여 현재 언어와 날짜 언어 설정을 확인할 수 있습니다.

    당신은 COUNT (*)를 원하는 경우 또한, 당신은 employee_id입니다으로 그룹에 필요

    select employee_id, count(*)
      from employee
     where employee_date_hired > date '1995-12-31'
     group by employee_id
    

    이렇게하면 employee_id입니다 당 수를 제공합니다.

  2. ==============================

    2.결론,

    결론,

    TO_CHAR는 자신의 방식으로 작동

    그래서,

    항상 비교를 위해이 형식 YYYY-MM-DD를 사용 대신 MM-DD-YY 또는 DD-MM-YYYY 또는 다른 형식의

  3. ==============================

    3.다음과 같이 TRUNC 및 TO_DATE을 사용할 수 있습니다 :

    다음과 같이 TRUNC 및 TO_DATE을 사용할 수 있습니다 :

    select TO_CHAR (g.FECHA, 'DD-MM-YYYY HH24:MI:SS') fecha_salida, g.NUMERO_GUIA, g.BOD_ORIGEN, g.TIPO_GUIA, dg.DOC_NUMERO, dg.* 
    from ils_det_guia dg, ils_guia g
    where dg.NUMERO_GUIA = g.NUMERO_GUIA and dg.TIPO_GUIA = g.TIPO_GUIA and dg.BOD_ORIGEN = g.BOD_ORIGEN
    and dg.LAB_CODIGO = 56 
    and trunc(g.FECHA) > to_date('01/02/15','DD/MM/YY')
    order by g.FECHA;
    
  4. ==============================

    4.쿼리에서 :

    쿼리에서 :

    Select employee_id, count(*) From Employee 
    Where to_char(employee_date_hired, 'DD-MON-YY') > '31-DEC-95' 
    

    난, 당신이 사용할 수있는 당신이 직원의 수 표시를 원하는 경우 6 월 20 일, 1994 년 이후에 고용되는 직원의 수를 표시하지의 생각 :

    Select count(*) From Employee 
    Where to_char(employee_date_hired, 'YYYMMMDDD') > 19940620 
    

    나는 당신이 사용할 수있는 비교 날짜에 가장 좋은 방법에 대한 생각 :

    employee_date_hired > TO_DATE('20-06-1994', 'DD-MM-YYYY');
    or
    to_char(employee_date_hired, 'YYYMMMDDD') > 19940620;
    
  5. ==============================

    5.날짜를 문자로 변환하기 때문에 단일 인용,이 있어야합니다.

    날짜를 문자로 변환하기 때문에 단일 인용,이 있어야합니다.

    Select employee_id, count(*)
    From Employee
    Where to_char(employee_date_hired, 'DD-MON-YY') > '31-DEC-95';
    
  6. from https://stackoverflow.com/questions/10178292/comparing-dates-in-oracle-sql by cc-by-sa and MIT license