2017-01-19 2 views
0

두 개의 쿼리를 실행하고 서로 다른 결과를 반환합니다. 내가 빠진 것을 찾아 내도록 도와주세요.동일한 함수가 Oracle에서 다른 결과를 반환합니다.

select UPPER(TO_CHAR(Hire_date,'MONTH')) 
from employees 

returns a list of months(containing "2" entries for 'MARCH') 

SELECT COUNT(EMPLOYEEID) "March Joinees" 
FROM Employees 
WHERE UPPER(TO_CHAR(Hire_date,'MONTH')) = 'MARCH'; 

returns 0 as count 

답변

2

to_char(<date>, 'Month')는 (현재 세션의 언어에서) 어떤 달 이름의 최대 길이와 동일한 길이의 문자열을 생산 - 그것은 공백으로 패딩으로 그렇게한다. 이것이 두 번째 쿼리가 결과를 생성하지 않는 이유입니다. upper....trim(...) 내에두면 작동하지만이 종류의 쿼리를 시작하는 데 to_char(..., 'Month')을 사용하지 않는 것이 좋습니다. 나는 당신이 같은 결론에 도달했다고 확신하지만, 당신은 단지 무슨 일이 일어나고 있는지 알고 싶습니다 ...

다음 그림이 있습니다. 결과의 첫 번째 열이 'March' 인 것처럼 보일 수 있습니다. 그러나 두 번째 열은 거짓이 아닙니다. 첫 번째 열의 결과는 실제로 'March ' (끝에 네 개의 공백이 있음)입니다.

select to_char(date '2016-03-01', 'Month')   as month_as_string, 
     length(to_char(date '2016-03-01', 'Month')) as len 
from dual 
; 

MONTH_AS_STRING LEN 
--------------- --- 
March    9 

그러면 오라클이 왜 그런 이상한 선택을했는지 물을 수 있습니다. 그것은 훨씬 더 어려운 질문입니다. 어쨌든이 동작은 문서화되어 있습니다. http://docs.oracle.com/cd/B19306_01/server.102/b14200/sql_elements004.htm#i34924을 입력하고 표 2.15의 MONTH까지 스크롤합니다.

2

이미 mathguy에 명시된 바와 같이 'MONTH'은 공백으로 채워집니다. 효과를 보려면

SELECT '"'||TO_CHAR(Hire_date, 'Month')||'"' FROM employees 

을보십시오. 그런 다음 TO_CHAR(Hire_date, 'Month') 결과 중 기능을 TRIM 또는 형식 모델 수정

FM를 사용하면 현재 세션 NLS_DATE_LANGUAGE 값 따라 달라집니다. 다른 세션에서는 "März"또는 "Μάρτιος"를 얻을 수 있습니다. 날짜 언어를 지정하거나 월 번호를 사용하십시오.

실제로 UPPER(TO_CHAR(Hire_date,'MONTH'))은 중복됩니다. 형식 MONTH은 월 이름을 대문자로 반환하므로 UPPER()을 다시 만들 필요가 없습니다. 당신이하는 내 추천으로 지금까지

WHERE TO_CHAR(Hire_date, 'fmMONTH', 'NLS_DATE_LANGUAGE = english') = 'MARCH' 

WHERE UPPER(TO_CHAR(Hire_date, 'fmMonth', 'NLS_DATE_LANGUAGE = english')) = 'MARCH' 

WHERE TRIM(TO_CHAR(Hire_date, 'MONTH', 'NLS_DATE_LANGUAGE = english')) = 'MARCH' 

WHERE TO_CHAR(Hire_date, 'MM') = '03' 

WHERE EXTRACT(MONTH FROM Hire_date) = 3 
+0

... 아래의 표현 중 하나를 사용한다 (그리고 나는뿐만 아니라 반드시 당신을 생각합니다) 계정으로 모든 촬영

단지 마지막 하나입니다! :-) – mathguy

관련 문제