如果错误日期,则使用默认日期更新PSQL列

时间:2017-05-09 06:24:16

标签: sql date postgresql-9.3

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

1 个答案:

答案 0 :(得分: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 ;

FOR 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。因此,在应用条件后,它将使用特定ID更新该记录。

希望这会有所帮助。