2017-05-09 7 views
0

PostgreSQL 9.321117-03-04과 같은 잘못된 날짜가있는 테이블 약속에서 약속 날짜라는 열이 있습니다. 열의 모든 행을 기본 날짜로 업데이트하려고합니다. 해당 열의 값이 잘못된 날짜이면 1900-01-01입니다. 아직 어떤 해결책도 시도하지 못했습니다. 도와주세요.잘못된 날짜 인 경우 기본 날짜로 PSQL 열 업데이트

+0

관련 솔루션 : http://stackoverflow.com/questions/25374707/check-whether-string-is-a-date-postgresql 내 표는이 'SELECT patientappointmentid, interactionid, appointmentdate, appointmentreasonid처럼 보이는 –

답변

0

당신은

DELIMITER $$ 
CREATE DEFINER=`root`@`localhost` PROCEDURE `MAKE_ACCURATE_DATE`() 
BEGIN 
DECLARE VAR_ID varchar(100); 
DECLARE VAR_DATE DATE; 
DECLARE VAR_FINISHED INT(11) DEFAULT 0; 
DECLARE DATABASE_CURSOR CURSOR FOR 
       SELECT DATE(DATE_COLUMN) DATE_COLUMN,ID 
       FROM YOUR_TABLE_NAME; 


       DECLARE CONTINUE HANDLER FOR NOT FOUND SET VAR_FINISHED = 1; 

       OPEN DATABASE_CURSOR; 
       GET_NEXTRECORD: LOOP 

         FETCH DATABASE_CURSOR INTO VAR_DATE,VAR_ID; 

          IF VAR_FINISHED = 1 THEN 
         LEAVE GET_NEXTRECORD; 
         END IF; 

          IF VAR_DATE =NULL THEN 
          UPDATE YOUR_TABLE_NAME SET DATE_COLUMN='1900-01-01' WHERE ID=VAR_ID; 
          END IF; 

       END LOOP GET_NEXTRECORD; 

       CLOSE DATABASE_CURSOR; 

END$$ 
DELIMITER ; 

또는 POSTGRES

CREATE OR REPLACE FUNCTION IS_VALID_DATE(S VARCHAR) RETURNS BOOLEAN AS $$ 
BEGIN 
    PERFORM S::DATE; 
    RETURN TRUE; 
EXCEPTION WHEN OTHERS THEN 
    RETURN FALSE; 
END; 
$$ LANGUAGE PLPGSQL; 

위한 절차 아래 사용하고 아래와 같이 위의 기능에 변화를 만들 수 있습니다.

CREATE OR REPLACE FUNCTION MAKE_ACCURATE_DATE() 
RETURNS void AS 

$BODY$ 

DECLARE 

RECORD RECORD; 
COUNT INT; 

    BEGIN 

    COUNT=0; 
    FOR RECORD IN SELECT * FROM cpad.dtl_patientappointment; 

    LOOP 

     IF(!IS_VALID_DATE(RECORD.appointmentdate)) THEN 
     UPDATE cpad.dtl_patientappointment SET appointmentdate='1900-01-01' WHERE patientappointmentid=RECORD.patientappointmentid; 
     END IF; 


    END LOOP; 

    END; 
$BODY$ 
LANGUAGE plpgsql; 

그리고이 라인

SELECT MAKE_ACCURATE_DATE(); 
을 실행

날짜 조건을 적용한 후 proper.So하지 않은 경우 그것은 하나 테이블 하나에서 해당 기록을 가져옵니다 및 DATE(DATE_COLUMN)이 로, 그것은 반환 널 것이다 특정 ID으로 해당 레코드를 업데이트합니다.

희망이 도움이 될 것입니다.

+0

, appointmentcomment, 업데이트, deleteflag, 사용자 ID, providerid, deletereason FROM cpad.dtl_patientappointment; 커서를 업데이트하십시오 –

+0

postgres에서 오류가 발생했습니다. –