oracle 預存程序中使用date 時、分、秒丟失,oracledate
今天有一開發兄弟找我,說出現一奇怪現象,在預存程序中賦date類型的值,時、分、秒都丟失了,下面來做個實驗:
SQL> drop table test purge;
SQL> create table test
(
fill_date date
);
SQL> insert into test values(sysdate);
SQL> commit;
SQL> select to_char(fill_date,'yyyy-MM-dd HH24:mi:ss') from test;
TO_CHAR(FILL_DATE,'
-------------------
2014-07-18 17:47:22
SQL> CREATE OR REPLACE PROCEDURE test_p
is
s_sql varchar2(500);
s_date date;
begin
s_date:= to_date('2014-07-18 17:24:32','yyyy-MM-dd HH24:mi:ss');
s_sql := 'UPDATE test SET fill_date = '''||s_date ||'''';
execute immediate s_sql;
commit;
end;
/
SQL> call test_p();
SQL> select to_char(fill_date,'yyyy-MM-dd HH24:mi:ss') from test;
TO_CHAR(FILL_DATE,'
-------------------
2014-07-18 00:00:00 --可以看到確即時、分、秒已經丟失,懷疑是隱式轉換導致
--調整下預存程序,看列印出什麼來。
SQL> CREATE OR REPLACE PROCEDURE test_p
is
s_sql varchar2(500);
s_date date;
begin
s_date:= to_date('2014-07-18 17:24:32','yyyy-MM-dd HH24:mi:ss');
s_sql := 'UPDATE test SET fill_date = '''||s_date ||'''';
dbms_output.put_line(s_sql);
execute immediate s_sql;
commit;
end;
/
SQL> set serveroutput on
SQL> call test_p();
UPDATE test SET fill_date = '18-7月 -14'
調用完成。
--確認發生了隱式轉換,那就使用綁定變數了
SQL> CREATE OR REPLACE PROCEDURE test_p
is
s_sql varchar2(500);
s_date date;
begin
s_date:= to_date('2014-07-18 17:24:32','yyyy-MM-dd HH24:mi:ss');
s_sql := 'UPDATE test SET fill_date = :1';
execute immediate s_sql using s_date;
commit;
end;
/
SQL> call test_p();
調用完成。
SQL> select to_char(fill_date,'yyyy-MM-dd HH24:mi:ss') from test;
TO_CHAR(FILL_DATE,'
-------------------
2014-07-18 17:24:32
oracle 預存程序字串轉化為date
select to_date(to_char(firstTiem,'yyyy-MM-dd hh24:mi:ss'),'yyyy-MM-dd hh24:mi:ss') into fTime from dual;
如果 firstTiem是varchar2類型的話。
oracle預存程序中date類型怎調用
沒怎麼調用,如果需要用to_date('20120505','yyyymmdd')轉換成Date用