programing

Oracle SQL 날짜 비교

goodsources 2023. 2. 14. 20:14
반응형

Oracle SQL 날짜 비교

1994년 6월 20일 이후에 고용된 직원 수를 표시하려고 하는데

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

근데 에러가 나서

"JUN" 식별자가 잘못되었습니다.

제발 도와주세요, 고마워요!

31-DEC-95끈도 아니다20-JUN-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')

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

  • 기재되어 은 a_horse_no_name입니다.DEC반드시 12월을 의미하는 것은 아닙니다.및 설정에 따라 다릅니다.비교가 모든 로케일에서 작동하도록 하려면 datetime 형식 모델을 사용할 수 있습니다. MM 대신에
  • 95년은 정확하지 않아1995년이라는 거 알지? 하지만 50년이라면 1950년인가 2050년인가?항상 분명하게 말하는 것이 최선이다.
select employee_id
  from employee
 where employee_date_hired > to_date('31-12-1995','DD-MM-YYYY')

날짜 리터럴

날짜 리터럴은 ANSI 표준의 일부이므로 Oracle 관련 함수를 사용할 필요가 없습니다.리터럴을 사용하는 경우 날짜를 형식으로 지정해야 합니다.YYYY-MM-DD시간 요소를 포함할 수 없습니다.

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

날짜 에는 시간되어 있기 날짜는 Oracle 날짜와 .1995-12-31 00:00:00.

리터럴을 . 리터럴은 타임스탬프 리터럴 형식으로 타임스탬프 리터럴은 다음 형식을 사용합니다.YYYY-MM-DD HH24:MI:SS[.FF0-9]

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

추가정보

NLS_DATE_LANGUAGE 는 에서 파생되며 에서 파생됩니다.데이터베이스를 처음 만들 때 설정되지만 초기화 매개 변수 파일을 정말 필요한 경우에만 변경하거나 구문을 사용하여 세션 수준에서 변경할 수 있습니다.예:

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

이것은 다음을 의미합니다.

  • DD ~31 의 의 숫자.
  • MM~ 은 0101 ~ 12 (1월은 01)의 달
  • YYYY4자리 연도 - 내 생각에 이것은 항상 2자리 연도보다 낫다.YY당신이 말하는 세기와 혼동하지 않기 때문입니다.
  • HH24시각, 0 ~ 23
  • MI분, 0 ~ 59
  • SS분초, 0-59

현재 언어 및 날짜 언어 설정은 다음을 통해 확인할 수 있습니다.V$NLS_PARAMETERSs쿼리함으로써 유효한 값의 전체 범위를 확인합니다.V$NLS_VALID_VALUES.

추가 정보


덧붙여서, 만약 당신이 원하는 것이count(*)그룹화해야 합니다.employee_id

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

이것으로, 다음의 카운트를 알 수 있습니다. employee_id.

결론,

to_char나름의 방법으로 기능하다

그렇게,

비교에는 항상 MM-DD-YY 또는 DD-MM-YYY 또는 기타 형식 대신 이 YYY-MM-DD 형식을 사용하십시오.

다음과 같이 trunk 및 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;

문의 내용:

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

1994년 6월 20일 이후에 고용된 직원 수를 표시하지 않기 위해서라고 생각합니다.종업원수를 표시하는 경우는, 다음의 항목을 사용할 수 있습니다.

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;

날짜를 문자로 변환했으므로 단일 따옴표가 있어야 합니다.

employee_id, count(*)를 선택합니다.종업원으로부터여기서 to_char(employe_date_hired, 'DD-MON-YY')> '31-DEC-95';

언급URL : https://stackoverflow.com/questions/10178292/comparing-dates-in-oracle-sql

반응형