如何正确地将旧日期插入表格?
Posted
技术标签:
【中文标题】如何正确地将旧日期插入表格?【英文标题】:How to insert old date into a table correctly? 【发布时间】:2017-03-20 16:03:08 【问题描述】:我正在尝试将旧日期 (01/01/1888) 插入 pl/sql 代码中的表中,但我只插入了值 (01/01/1988)。 将这个旧日期插入表格的正确方法是什么?
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;
当我检查表 test_date 时,插入的值是 01/01/1988 和 01/01/0088。
谢谢!
【问题讨论】:
【参考方案1】:我认为你的代码可以简化。
如果我理解得很好,你需要从两个变量中插入最小值;如果是,则不需要动态 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
类型。
【讨论】:
对不起,我给你举了一个不好的例子。尽量简单,我从我的程序中删除了很多其他代码。我必须使用代码'sql_str :='insert into test_date values ( ''' ||p_eventDate ||''')';'然后在我的过程结束时根据其他条件立即执行 sql_str,我不能使用“使用 someVariable 立即执行 sql_str;”执行它。谢谢! 这解决了我的问题。谢谢! 如果你不需要时间组件就更简单了(即时间是 00:00:00),'insert into test_date values (date ''' || to_char(p_date, 'yyyy-mm-dd') || ''')'
.以上是关于如何正确地将旧日期插入表格?的主要内容,如果未能解决你的问题,请参考以下文章