2011-09-22 4 views
1

날짜가 문자 형식으로되어있는 테이블이 있습니다. 날짜 형식을 확인하고 싶습니다. DB2에서이 작업을 어떻게 수행 할 수 있는지 알려주십시오. ISDATE 함수가 있지만 DB2에서는 작동하지 않는다는 것을 알고 있습니다. 내가 날짜 기지로 DB2를 사용 AS400 오전 .. 실제로DB2에 해당하는 ISDATE

+0

()는 SQL 함수, DB2도 어떤 SQL DBMS의 일부가 될 수 없습니다 예상해야되지 않습니다. MS SQL Server 용 T-SQL 함수입니다. _ (오라클도 OLAP에 ISDATE 프로그램을 가지고 있습니다. Sybase와 같은 다른 DBMS에는 유사한 기능이있을 수 있습니다.) 좋은 답변을 제공하려면 사용 방법, 특히 무엇을 원하고 있는지 알아야합니다 유효하지 않은 날짜 값. – user2338816

답변

3

을 저를 도와주세요, 그것은 AS/400 용 DB2처럼 보이는 수도 나는 V6R1 참조에서 아무것도 찾을 수 없습니다합니다 (ISDATE() 기능을 가지고 있지 - 흥미롭게도 LUW 참조). 그래서 당신의 문제는 그 기능이 존재하지 않는 것처럼 보입니다.

물론 문제의 근본 원인은 유효하지 않은 날짜를 변환하려고하면 명령문이 중단됩니다. 그 점을 감안할 때이 문은 형식화가 가능하면 날짜를, 그렇지 않은 경우 null을 제공해야합니다. 미국 및 EUR 형식/주문을 혼합 한 경우 일 수도 있고이 아니고은 데이터를 올바르게 복구 할 수 있습니다 (구분 기호가 다르면 기본값으로 생각할 수 있습니다. 괜찮습니다).). 이 속으로

String Dates 
============= 
2011-09-22 
22.09.2011 
09/22/2011 
a111x90x00 -- And who knows what this is... 

:

WITH date_format(strDate, format) as (
    SELECT strDate, 
     CASE 
      WHEN strDate LIKE('____-__-__') THEN 'ISO' 
      WHEN strDate LIKE('__.__.____') THEN 'EUR' 
      WHEN strDate LIKE('__/__/____') THEN 'USA' 
      ELSE NULL END 
    FROM dataTable 
) 
SELECT 
    strDate, 
    format, 
    CASE 
     WHEN format IS NOT NULL THEN DATE(strDate) 
     ELSE NULL 
    END AS realDate 
FROM date_format 

이이처럼 보이는 데이터 테이블을 회전

Results: 
strDate  format realDate 
============================ 
2011-09-22 ISO  2011-09-22 
22.09.2011 EUR  2011-09-22 
09/22/2011 USA  2011-09-22 
a111x90x00 -  -    

이 예는 자동 번역의 기본 형식을 사용하여 물론이다. 다른 것이 있으면 수동으로 변환해야합니다 (형식을 반환하는 대신 ISO로 변환 한 다음 캐스트 할 수 있습니다).

+0

이것을 UDF로 만들면 다른 '문자 날짜'열에서 더 쉽게 사용할 수 있습니다. –

+0

Clockwork-Muse 응답은 날짜를 확인하는 데 사용할 수있는 답변보다 짧습니다. 테스트를 통해 '2016-02-30'또는 '2016-04-31'과 같이 잘못된 날짜가 표시되면 오류가 발생합니다.논리는 단순히 DATE() 변환을 시도하기 위해 CASE 문에 표시하기에 충분하지 않은 형식을 검사합니다. 위의 답변에 대한 귀하의 고려 사항은 특정 날짜 형식 (형식 및 값)으로 화면에 표시하려고 시도하는 것과 달리 특정 방식으로 서식이 지정된 데이터를 화면에 표시하려는 욕망에 따라 달라집니다. – geolemon

+0

대체 답변은 http://stackoverflow.com/questions/37055675/validate-dates-before-conversion-aka-isdate-equivalent에서 논의되고 있습니다. – Stavr00

0

" 날짜 형식을 확인하십시오"의도하지 않거나 기존 ISDATE() 효과가 무엇인지 알지 못하지만 그 이름이 암시하는 내용이 충분히 명확하게 보입니다. 고려 :

v5r3 [즉, 오직 그 두 가지를 보장하기 위해 나쁜 날짜 문자열 문자열 예제 값과 일부 가비지 텍스트 입력이 실제로 NULL을 반환했으며 실제로 각각 NULL이 반환되었고 유효한 값이있는 날짜 형식이 표준 날짜 형식으로 반환되었습니다. DATE에 캐스트 될 수있는 값으로 최대 10 자의 문자열 변경을 평가하는 입력; 입력 값을 날짜로 변환 할 수없는 경우 결과는 NULL입니다. 물론 처음에는 NULL 값이 유효하지 않은 날짜 문자열에 대해 생성 된 결과와 직접 구별되지 않는다는 것을 의미합니다.

그 대신 결과로 TRUE 또는 FALSE과 같은 원하는 표시기가 필요한 경우 사용자 정의 함수 (UDF)의 사용을 CASE 식으로 코딩 할 수 있습니다. 예컨대 : ISDATE 이후
CASE WHEN ISDATE(myVCcol) IS NULL THEN 'FALSE' ELSE 'TRUE' END

DROP FUNCTION ISDATE        
;             
CREATE FUNCTION ISDATE        
(InpDateStr VARCHAR(10)       
) RETURNS DATE          
LANGUAGE SQL          
DETERMINISTIC          
RETURNS NULL ON NULL INPUT       
    SET OPTION DBGVIEW = *SOURCE , DATFMT = *ISO  
BEGIN            
DECLARE EXIT HANDLER FOR SQLEXCEPTION RETURN NULL ; 
RETURN DATE(InpDateStr) ;       
END             
;             
관련 문제