将postgresql触发器转换为mysql触发器

时间:2017-09-12 16:40:50

标签: mysql postgresql

我正在尝试将postgres触发器转换为mysql触发器。它会根据添加的日期自动添加字段

CREATE FUNCTION convert_date ()
    RETURNS trigger
    AS $$

declare
    date_min DATE;
    date_max DATE;
    temp_year INTEGER;
begin
    SELECT SUBSTRING(NEW."dc_date_label",0,5)::integer
    INTO temp_year;

    SELECT  date(temp_year || '-01-10')
    INTO    date_min;

    SELECT  date(temp_year +1 || '-09-30')
    INTO    date_max;

    NEW."dc_date_start" = date_min;
    NEW."dc_date_end" = date_max;

    RETURN new;
end;

CREATE TRIGGER trig_b_i_compute_date()
    BEFORE INSERT
    ON campaigns
    FOR EACH ROW
    EXECUTE PROCEDURE convert_date();

这就是我在mysql上所做的:

DELIMITER //
CREATE TRIGGER trig_b_i_compute_date
    BEFORE INSERT ON campaigns
    FOR EACH ROW
    BEGIN
        DECLARE date_min DATE;
        DECLARE date_max DATE;
        DECLARE temp_year INTEGER;

    SET temp_year = SELECT CONVERT( SUBSTRING(NEW.dc_date_label,1,5), UNSIGNED INTEGER) ;
    SET date_min =  SELECT CONVERT( CONCAT(temp_year,'-01-10'), DATE);
    SET date_max =  SELECT CONVERT( CONCAT(temp_year + 1, '09-30'), DATE);

    SET NEW.dc_date_start = date_min;
    SET NEW.dc_date_end = date_max;


    END;
    //
DELIMITER ;

但是我收到错误:

MySQL server version for the right syntax to use near 'SELECT CONVERT( SUBSTRING(NEW.dc_date_label,1,5), UNSIGNED INTEGER) ;

手术有什么问题?

1 个答案:

答案 0 :(得分:0)

如果在SET语句中使用SELECT,则需要将其放在括号中:

SET temp_year = (SELECT ...);

但是在你的情况下你不需要SELECT而你可以跳过它:

SET temp_year = CONVERT(...);

您还可以在MySQL中使用SELECT INTO语法:

SELECT CONVERT(...) INTO temp_year;

并且无需声明date_mindate_max。也不需要明确地抛出一切。你的触发器主体可能是:

DECLARE temp_year INTEGER;

SET temp_year = CONVERT( SUBSTRING(NEW.dc_date_label,1,5), UNSIGNED);
SET NEW.dc_date_start = CONCAT(temp_year,     '-01-10');
SET NEW.dc_date_end   = CONCAT(temp_year + 1, '-09-30');

我不知道dc_date_label的样子,以及为什么这一年的长度应为5个字符。所以我保持年度提取。但如果它是DATE,DATETIME或TIMESTAMP,您可以使用YEAR函数:

SET temp_year = YEAR(NEW.dc_date_label);

由于它更短,你也可以使用它内联并跳过temp_year变量:

SET NEW.dc_date_start = CONCAT(YEAR(NEW.dc_date_label),     '-01-10');
SET NEW.dc_date_end   = CONCAT(YEAR(NEW.dc_date_label) + 1, '-09-30');

最后一个:在END之后删除分号。它可能有效,但它不属于那里。