2017-11-06 10 views
0

나는이 간단한 SQL 스크립트가보다 큰 2039 날짜 : I는 iSeries의 네비게이터에서 스크립트를 실행 할 때마다AS400 에뮬레이터 캔트 과정 미만 1940 또는

SELECT DATE(SUBSTR('19310205' , 1 , 4) 
|| '-' || SUBSTR ('19310205' , 5 , 2) 
|| '-' || SUBSTR('19310205', 7 , 2)) 
FROM MY_TABLE; 

을, 나는

예상 출력 취득하는

1931년 2월 5일

그러나, 나는 STRSQL 명령을 사용하여 AS400 에뮬레이터에서 실행하면, 다음과 같은 출력을 얻을 :

이런 일이 발생하는 이유 ++++++++

617,451,515,

나는 아무 생각이 없다 내가 아는 전부는 1940-2039 년 사이의 날짜 만 잘 작동한다는 것입니다. 왜 그 이유를 설명 할 수 있습니까?

또한 다른 날짜도 성공적으로 처리 할 수있는 방법이 있습니까?

+1

AS400 에뮬레이터는 무엇입니까? – jmarkmurphy

+0

SQL을 볼 수 있도록 변경되었습니다. – danny117

답변

4
  • AS/400 에뮬레이터 세션에서 "F13 = Services"를 누르십시오.

  • 선택

  • 변경 전체 날짜 범위를 지원하는 "날짜 형식"을 "* ISO"또는 원하는 형식을 "1. 변경 세션 속성".

  • 는 IBM 지식 센터에서

, "Rational Developer for i7.1.0"날짜가 양력 calendar20에 따라 세 부분 값 (년, 월, 일) 시점을 지정>는

, > 1 년 광고의 유효 기간으로 가정합니다. 연도 부분의 범위는 0001 - 9999입니다. 날짜 형식> * JUL, * MDY, * DMY 및 * YMD는 1940 ~ > 2039 월 부분의 범위는 1 - 12입니다. 날짜 부분의 범위는 1에서> x입니다. 여기서 x는 월, 연도에 따라 28, 29, 30 또는 31입니다.

2

리차드 에반스의 답변을 바탕으로하고 싶지만 의견이 너무 많아서 새로운 대답으로 만들 것입니다.

IBM i는 0001 년 1 월 1 일부터 9999 년 12 월 31 일까지의 날짜를 저장할 수있는 고유 한 날짜 유형을 가지고 있습니다. 날짜 유형은 날짜의 연도 부분의 자릿수를 지정하는 형식을 갖습니다 . 받아 들일 수있는 날짜 범위에 영향을 미치는 두 가지 주요 그룹이 있습니다. 1940 년 1 월 1 일부터 2039 년 12 월 31 일까지의 날짜를 받아 들일 수있는 두 자리 연도 형식. *MDY, *DMY, *YMD*JUL입니다. 4 자리 연도 형식은 날짜 유형이 지원하는 전체 날짜 범위를 처리 할 수 ​​있습니다. 이들은 *ISO, *USA, *EUR, *JIS입니다.

날짜 형식이 지원되는 모든 곳에서 지원되는 기본 형식 외에도 RPG는 *JOBRUN, 세 자리 연도 형식 및 *LONGJUL과 같은 몇 가지 다른 날짜 형식을 지원합니다. *JOBRUN은 두 자리 연도 형식이며 2 자리 연도의 숫자 및 문자 날짜 필드에만 지정할 수 있습니다. 작업 날짜 형식과 분리 자 값을 사용합니다.세 자리 연도 형식은 1900 년 1 월 1 일부터 2899 년 12 월 31 일까지의 날짜를 처리 할 수 ​​있습니다. 이들은 *CMDY, *CDMY*CYMD입니다. 세 자리 연도 형식의 C 날짜의 연도 부분의 가장 중요한 두 자릿수를 나타냅니다 :

0 => 1900 - 1999 
1 => 2000 - 2099 
2 => 2100 - 2199 
... 
9 => 2800 - 2899 

마지막으로 *LONGJUL는 4 자리 연도 율리우스 형식입니다.

내부적으로 날짜는 *ISO 형식으로 저장됩니다. 다른 형식은 외부 형식입니다. 실제로 SQL을 사용하여 테이블을 정의 할 때 날짜 형식을 지정하지 않아도 * ISO가 기본값으로 사용됩니다. 형식을 지정할 수있는 곳에서는 지정하는 외부 형식입니다. DDS를 사용할 때도 모든 작업 필드와 데이터베이스 파일에 *ISO을 사용하는 것이 가장 좋습니다. 그런 다음 *MDY 또는 *DMY과 같은 기타 외부 형식을 사용자가 마주 향하게 입력하여 *ISO 형식을보다 현지화 된 형식으로 변환하십시오. 이렇게하면 사용자가 입력하거나 볼 수있는 전체 날짜 범위를 저장할 수 있습니다.

+0

IBM이 이것을 2039 가지 접근 방법으로 처리하는 방법을 살펴 보는 것은 흥미로울 것입니다. (물론, AS400/IBM에 대해 20 년 동안 또 다른 내기를하지 않을 것입니다.) –

+0

IBM i에는 컷오프를 조정하여이 문제를 처리 할 수있는 API가 있습니다 날짜. 그러나 나는 CYYMMDD 해킹이나 4 자리 연도로의 변환보다는 1940 해킹을 사용하여 Y2K 문제를 처리 한 회사가 새로운 해킹을 선택하거나 4 자리 연도로 변경해야한다고 생각합니다. – jmarkmurphy

+0

@RichardEvans는 시스템이 4 자리 연도를 저장하고 있으며 사용자가 특정 두 자리 연도 형식을 표시하도록 요청하거나 (이 경우 구성된 경우) 게시 된 문제가 발생하고 있음을 기억하십시오. 사용자가 4 자리 연도 형식을 사용하는 한, 모호성이없고 형식 오류가 없습니다. 또한 사용자는'VARCHAR_FORMAT()'함수를 사용하여 날짜 나 타임 스탬프를 사용자 정의 형식으로 표시 할 수 있습니다. – WarrenT

0

varchar_format() 기능을 사용하여 어떤 형식 으로든 날짜의 문자 표현을 반환합니다. 세션의 기본값이나 그 실행 위치에 관계없이.

SELECT        
cast(        
varchar_format(      
cast(        
DATE(SUBSTR('19310205' , 1 , 4)  
|| '-' || SUBSTR ('19310205', 5 , 2) 
|| '-' || SUBSTR('19310205', 7 ,2)) 
as timestamp)      
, 'YYYY-MM-DD')      
as char(10)) as mydate    
FROM sysibm/sysdummy1    

MyDate가
1931년 2월 5일
******** 데이터의 끝 ********