2014-07-22 3 views
1

우리 쿼리 중 하나에 이상한 문제가 있습니다. 다음은 아래의 테이블에 존재하는 샘플 데이터를 우리가데이터 값 "0"은 적색 변경에서 잘못된 형식 오류가 있습니다.

INSERT into test 
SELECT 
    member.name as mem_name, 
    CASE WHEN (member.dob>0 AND length (member.dob)=8) THEN (DATEDIFF(year,to_date("dob",'YYYYMMDD'), to_date(20140716,'YYYYMMDD'))) WHEN (member.dob=0) Then 0 END As Age, 
    20140716021501 
FROM 
    member 

를 실행하는 쿼리입니다.

|name   |dob 
|Ajitsh   |0  | 
|rk    |51015 | 
|s_thiagarajan |19500130 | 
|madhav_7  |19700725 | 
|1922   |0  | 
|rekha   |25478 | 
|vmkurup  |0  | 
|ravikris  |19620109 | 
|ksairaman  |0  | 
|sruthi   |0  | 
|rrbha   |19630825 | 
|sunilsw  |0  | 
|sunilh   |0  | 
|venky_pmv  |19701207 | 
|malagi   |0  | 
|an752001  |0  | 
|edsdf   |19790201 | 
|anuanand  |19730724 | 
|fresh   |19720821 | 
|ampharcopharma |19590127 | 
|Nanze   |19621123 | 

생년월일은 YYYYMMDD 형식으로 bigint에 저장됩니다. 데이터에 0, 51015와 같이 날짜가 유효하지 않은 행이 있습니다. 경우에 따라이 쿼리를 실행하면 다음 오류가 발생합니다.

그러나 이상한 점은 모든 시간이 아닌 임의로 오류가 발생한다는 것입니다. 여러 번 쿼리 나 데이터 집합을 변경하지 않고도 작동합니다. 가끔 두 번째 또는 세 번째 시도에서도 작동합니다. 의심되는 점은 to_date 함수가이 오류를 제공한다는 것입니다. 그러나 왜 무작위로 과 모든 실행에 오류를 제공하지 않습니다.

나는이 가정을 지원하기 위해이 작은 쿼리를 시도했습니다.
SELECT to_date(20140716,'YYYYMMDD'), to_date(0,'YYYYMMDD');
그러나 이것도 동일한 시나리오를 만듭니다. 은 부드럽게 나머지 시간 동안 실행되지만 오류는 무작위로 발생합니다.

+0

혹시이 질문에 대한 답변을 얻었습니까? 관련 문제가 있습니다. 나는'WHERE (getdate() :: date-date_value :: date) <= 90' 작업을 수행하고 있으며 반환 된 오류는 "데이터 값 .... 형식이 잘못되었습니다."입니다. 이상한 점은'getdate() :: date - date_value :: date'는 예상대로 작동하지만 WHERE에서 사용될 때 오류를 던집니다. –

+0

@Moon_Watcher, 나는이 질문에 대한 만족스러운 대답을 얻지 못했습니다. 한 가지 해결 방법은'WITH' 절을 사용할 수 있다고 생각합니다. 예 : 'WITH temp AS (SELECT getdate() :: date - date_value :: date를 diff FROM tablename으로 사용)에서 열을 선택하십시오. – jimy

답변

0

이 유형의 값을 무시하고이 형식을 날짜 형식으로 변환하면 다음과 같이 할 수 있습니다.

SELECT to_date('20140716','YYYYMMDD'), to_date('0','FMYYYYMMDD'); 

여기서 FM은 패턴의 출력을 고정 폭으로 만들기 위해 추가되는 선행 0과 후미 공백을 억제합니다.

+0

@llesh 'FM'옵션을 이용해 주셔서 감사합니다. 하지만 내 주요 관심사는 쿼리가 시작될 때마다 오류가 발생하는 것이 아니라 무작위로 발생시키는 이유입니다. – jimy

관련 문제