2017-05-09 43 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中出錯 –