我有一个函数可以在给定的时间段内删除那些记录,但是在执行它时会出错。
10:58:23 [EXPLAIN - 0 row(s), 0.000 secs] [Error Code: 0, SQL State: 42883] ERROR: operator does not exist: date < integer
Hint: No operator matches the given name and argument type(s). You might need to add explicit type casts.
Where: PL/pgSQL function delyearlyrecords(text) line 9 at EXECUTE statement
... 1 statement(s) executed, 0 row(s) affected, exec/fetch time: 0.000/0.000 sec [0 successful, 0 warnings, 1 errors]
请在下面找到功能
Create Or Replace Function DelYearlyRecords (tablename TEXT) Returns integer as $$
Declare
Start_Date date;
End_Date date;
Begin
Start_Date = (current_date - interval '13 months')::date;
End_Date = current_date;
execute 'delete from ' ||tablename||
' where cast(date_dimension_year || ''-'' || date_dimension_month || ''-''||date_dimension_day as date)
not between '|| Start_Date ||' and '|| End_Date || ' ';
RETURN 1;
END;
$$ LANGUAGE plpgsql;
谢谢&amp;问候, 拉杰夫
答案 0 :(得分:3)
这是一种将日期存储在表格中的可怕方式。将它们作为date
存储在表中,而不是年,月和日整数。
发生了什么
date_dimension_year || ''-'' || date_dimension_month || ''-''||date_dimension_day
评估为2012-04-01
之类的内容。这是一个关于整数的数学表达式,产生的结果如2007
。
您真正想要的是预先添加''
并附加'2012-04-01'
,这样您就可以获得date
,可以将其评估为date_dimension_year * INTERVAL '1' YEAR +
date_dimension_month * INTERVAL '1' MONTH +
date_dimension_day * INTERVAL '1' DAY
。
但更好的是,用间隔构建日期:
date
...然后去修复你的模式,这样你就可以将整个事物存储为{{1}}而不是一组3个整数,这样你就不必跳过所有这些箍。
答案 1 :(得分:1)
在SQL中,日期常量用单引号括起来。你需要将它们放在字符串中。您可以通过在字符串中包含双引号来实现此目的:
execute 'delete from ' ||tablename||
' where cast(date_dimension_year || ''-'' || date_dimension_month || ''-''||date_dimension_day as date)
not between '''|| Start_Date ||''' and '''|| End_Date || ''' ';