我正在尝试将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) ;
手术有什么问题?
答案 0 :(得分:0)
如果在SET语句中使用SELECT
,则需要将其放在括号中:
SET temp_year = (SELECT ...);
但是在你的情况下你不需要SELECT而你可以跳过它:
SET temp_year = CONVERT(...);
您还可以在MySQL中使用SELECT INTO语法:
SELECT CONVERT(...) INTO temp_year;
并且无需声明date_min
和date_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
之后删除分号。它可能有效,但它不属于那里。