2017-05-09 41 views
0

我正在使用PostgreSQL 9.3我有一个名为约会日期在表约会有错误的日期,如21117-03-04我希望更新列中的所有行有一个默认的日期,例如,如果该列上的值是任何错误的日期,则为1900-01-01。我还没有尝试过任何解决方案。请帮忙。如果错误日期更新PSQL列与默认日期

+0

相关的解决方案:http://stackoverflow.com/questions/25374707/check-whether-string-is-a-date-postgresql –

回答

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 ; 

OR 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(); 

它将由一个并获取从表中的你的记录作为 DATE(DATE_COLUMN)是存在的,它会返回NULL如果日期申请条件之后不proper.So将用特定的ID更新该记录。

希望这会有所帮助。

+0

我的表看起来像这样'SELECT patientappointmentid,interactionid,appointmentdate,appointmentreasonid, appointmentcomment, created,updatedated,deleteflag,userid, providerid,deletereason FROM cpad.dtl_patientappointment;'请更新光标 –

+0

我在postgres中出错 –