답변:
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')
이 방법에는 몇 가지 불필요한 함정이 있습니다
DEC
이 반드시 12 월을 의미하는 것은 아닙니다. 귀하 NLS_DATE_LANGUAGE
와 NLS_DATE_FORMAT
설정 에 따라 다릅니다 . 모든 로케일에서 작업과 비교할 수 있도록 대신 날짜 시간 형식 모델을 사용할 수 있습니다.MM
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
에서 유래 NLS_LANGUAGE
하고 NLS_DATE_FORMAT
로부터 유도된다 NLS_TERRITORY
. 데이터베이스를 처음 만들 때 설정되지만 실제로 필요한 경우에만 초기화 매개 변수 파일을 변경하거나 ALTER SESSION
구문 을 사용하여 세션 수준에서 변경할 수 있습니다 . 예를 들어 :
alter session set nls_date_format = 'DD.MM.YYYY HH24:MI:SS';
이것은 다음을 의미합니다.
DD
월의 일, 1-31MM
연도의 숫자 월, 01-12 (1 월은 01)YYYY
네 자리 연도-내 생각에 이것은 당신이 말하는 세기와 혼동이 없기 때문에 항상 2 자리 연도보다 낫습니다 YY
.HH24
하루 중 시간, 0-23MI
분, 0-59SS
분의 초, 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
.
DEC
반드시 유효한 월일 필요는 없습니다. 일반적으로 이름 대신 숫자를 사용하는 것이 좋습니다
timestamp
대신 리터 2 인 date
문자 : timestamp '2015-01-30 19:42:04'
(ANSI SQL의 경우 a 때문에 date
데이터 유형이 시간이없는, 단지 timestamp
데이터 유형 않습니다).
DATE 2016-04-01
수단 2016-04-01 00:00:00
입니다. 그리고이 구문은 Oracle 9i 부터 ANSI-SQL 구문이 Oracle에 도입 된 곳에서 작동한다고 생각합니다 .
define
는 정의한 모든 것을 해당 이름으로 모든 대체 변수로 대체하는 SQL * Plus 명령입니다 . ALTER SESSION
해당 세션 동안 일부 데이터베이스 매개 변수 또는 설정을 수정할 수있는 명령문입니다.
결론,
to_char
자체 방식으로 작동
그래서,
MM-DD-YY 또는 DD-MM-YYYY 또는 다른 형식 대신 항상이 형식 YYYY-MM-DD 를 사용하여 비교하십시오.
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;
귀하의 질문에서 :
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 (employee_date_hired, 'DD-MON-YY')> '31 -DEC-95 ';
> <
또는BETWEEN '' AND ''