2016-07-06 2 views
2

(제목이 편집 됨) 안녕하세요.IBM i CYYMMDD의 날짜 차이 - DATE()를 사용할 수 없습니다.

IBM i 버전 7.1을 사용하여 쿼리의 두 날짜 간의 차이를 계산합니다. 아무 것도 쉬운 일이 없기 때문에 하나의 날짜는 CYYMMDD 형식이고 다른 하나 (curdate())는 YYYY-MM-DD 형식입니다.

Cast(Cast(APENGD + 19000000 As varchar(10)) As date) As math 

하지만 난 단지 : 나는 VARCHAR (10) (소수 날짜로 주조 할 수 없기 때문에) 다음 날짜로 CAST에 있음을 감싸 나의 CYYMMDD 형식의 날짜 (필드 이름 APENGD을) CAST 시도 어떤 이유로 든 ++++++++++++++ 결과를 확인하십시오. 나는 이것의 몇 가지 다른 버전을 테스트 할 수 있었고 어디서나 DATE를 사용할 수 없다는 것을 알았습니다 ... 누군가가 대안을 제안 할 수 있습니까 ??

미리 감사드립니다. 문자열 구분 기호를 포함하면 현재까지

매트

+0

DB2의 차이점을 어떻게 계산할 계획입니까? 내가 알고있는 좋은 기본 제공 함수가 없으며 ['TIMESTAMPDIFF'는 거의 쓸모가 없습니다.] (http://stackoverflow.com/questions/7677529/db2-timestampdiff-function-returning-unexpected-results) . (이전 날짜 계산 때문에). 또한 열의 차이를 사용하면 색인이 무시되는 경우가 많습니다 (행 별 평가 정보가 필요하기 때문에). 차이점과 관련하여 무엇을 할 계획입니까? –

답변

3

주조 VARCHAR에만 작동합니다.

7.1에서 TIMESTAMP_FORMAT()을 사용할 수는 있지만 날짜가 아닌 타임 스탬프로 끝납니다. 그러나 그것은 쉽게 처리됩니다.

Date(Timestamp_format(char(APENGD + 19000000),'YYYYMMDD')) As math 

숫자/문자 값 날짜를 처리 할 때 가장 선호하는 솔루션은 변환을 처리 할 사용자 정의 함수를 만드는 것입니다.

직접 작성하거나 직접 작성해도됩니다. iDate Alan Campin 작성. 그런 다음 코드는 것 간단합니다 : 당신이 그렇게

WHERE CURRENT_DATE - 3 months <= idate(APENGD,'*CYMD') 

처럼 WHERE 절에 날짜 차이를 사용하려는 경우에는, 위의 APENGD 통해 기존 인덱스부터 제대로 수행 할 것을

idate(APENGD,'*CYMD') as nath 

주 (직접) 사용할 수 없습니다. 최근 (6.1 이상) OS 버전을 가정 할 때 APENGD를 최신으로 변환하는 데 사용하는 표현식을 포함하는 새 색인을 만들 수 있습니다.

또는 Alan이 도움이되는 날짜 -> 숫자 함수 ConvertToIdate을 사용하여 코드를 작성할 수 있습니다. 그러면 기존 색인을 사용할 수 있습니다. 당신이 두 날짜 사이의 차이를 계산하려면

WHERE ConvertToiDate(CURRENT_DATE - 3 months,'*CYMD') <= APENGD 
+0

고마워요, 찰스! TIMESTAMP_FORMAT 솔루션은 완벽하게 작동합니다. – user3593083

+0

WHERE 절은 APENGD를 DATE 형식으로 변환하는 _expression_에 대한 INDEX로 더 잘 수행되도록 만들 수 있습니다. i 6.1부터 _expressions_는 INDEX에 허용됩니다. 좋은 것을 그림으로 시험해보십시오. – user2338816

+0

@ user2338816, 좋은 지적입니다. 내 대답을 조정하겠습니다. – Charles

0

, 당신은 사용할 수 있습니다 기능의

`TIMESTAMPDIFF(32, cast(MYTIMESTAMP1 - MYTIMESTAMP2 as char(22)))` 

첫 번째 인수는 결과의 유형을 지정합니다.

1 밀리 16 일 2 : 제 32 : 주 4 분 64 개월 8 시간 128 : 삼 256 : 년

+0

'TIMESTAMPDIFF' (또는 실제로 타임 스탬프 뺄셈)를 사용하지 마십시오 : 예상치를 기반으로 결과를 계산합니다. 예상치 못한 결과가 나오면 [내가 여기에 설명되어 있습니다] (http://stackoverflow.com)/questions/7677529/db2-timestampdiff-function-returning-unexpected-results). –

+0

나는 그것을 몰랐다. – Esperento57

1

DDL은 내지 [제공되지 APENGD 열 정의]. 아무리해도 정의에 관계없이 다음 사항만으로 충분합니다. 문자열 또는 제로 스케일 숫자로 나타냅니다. 이 효과는 14 자 ([v7 발표 이후 26 자까지] 문자 스트링)의 SQL 인식에 따라 다릅니다.모든 분리 부족하므로 숫자 전용] TIMESTAMP 표현 :

date(timestamp((APENGD + 19000000) concat '000000')) 

IBM i 7.3->Database->Reference->SQL reference->Language elements->Data types->Datetime values->String representations of datetime values->Timestamp strings

타임 스탬프의 문자열 표현은 숫자로 시작하는 길이가 문자 또는 유니 그래픽 문자열 14 자 이상. ...