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