如何正确地将旧日期插入 table?

How to insert old date into a table correctly?

我试图将旧日期 (01/01/1888) 插入 pl/sql 代码中的 table,但我只插入了值 (01/01/1988)。 将这个旧日期插入 table 的正确方法是什么?

declare
  p_date date;
  p_eventDate date;
  sql_str varchar2(2000);
begin
   select to_date('01-01-1888','dd-mm-yyyy') into p_eventDate from dual;

   p_date := add_months(sysdate,-60);

   if( p_eventDate < p_date)
   then
       sql_str := 'insert into test_date values (''' ||p_eventDate ||''')';
       sql_str := 'insert into test_date values (to_date(''' ||p_eventDate ||''',''dd-mm-yyyy''))';
   else
      sql_str := 'insert into test_date values (''' ||p_date ||''')';
   end if;

   EXECUTE IMMEDIATE sql_str;

   commit;
  --dbms_output.put_line(sql_str);
end;

当我检查 table test_date 时,插入值 01/01/1988 和 01/01/0088。

谢谢!

我认为你的代码可以简化。

如果我理解的很好,你需要插入两个变量中的最小值;如果是这样,你不需要动态 SQL:

declare
  p_date date;
  p_eventDate date;
begin
   select to_date('01-01-1888','dd-mm-yyyy') into p_eventDate from dual;

   p_date := add_months(sysdate,-60);

   insert into test_date(d) values ( least(p_date, p_eventDate));

   commit;
end;

抛开动态 SQL,您代码中的主要问题是您在字符串中使用日期而不转换它们,因此依赖于隐式转换。

如果出于某种原因,您想使用动态 SQL,一个好的方法是使用绑定变量,例如:

...
sql_str := 'insert into test_date values (:1)';
execute immediate sql_str using someVariable;
...

如果您想保留代码的结构,您的 SQL 字符串应该是:

sql_str := 'insert into test_date values ( to_date(''' || to_char(p_date, 'dd-mm-yyyy') || ''', ''dd-mm-yyyy''))';

也就是说,您首先必须将 date 变量转换为字符串,使用它来连接您的语句,然后在您的语句中,将字符串转换回 date 类型。