postgres函数执行错误

时间:2014-05-12 05:32:43

标签: sql postgresql

我有一个函数可以在给定的时间段内删除那些记录,但是在执行它时会出错。

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;问候, 拉杰夫

2 个答案:

答案 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 || ''' ';