1

我在数据库中有一个表,我从中获取日期字段中的值。我将此日期值存储在游标中。当前日期值的格式为 DD:MON:YY。现在我使用 to_char 函数将此日期转换为字符,以便将时间 00:00:00 附加到它。现在我尝试转换回日期格式,但没有附加时间戳,日期格式也不是我给出的(格式与数据库中的日期字段相同)。但是 to_char 函数返回正确的格式,因为我给了。

部分代码片段如下:

将游标初始化为

cursor cur is
select to_char(STV_FROM_DATE,'DD:MON:YYYY:')STV_FROM_DATE :---from a table in DB
cur1 cur%rowtype;
begin
open cur;
loop
fetch cur into cur1;
dbms_output.put_line(cur_1.STV_FROM_DATE);

这正确地给出了值:

01:JAN:2000:
01:JAN:2000:
01:JAN:2000:
01:JAN:2000:

现在我将时间戳 00:00:00 附加到此并执行 to_date 操作,如下所示:

STV_FROM_DATE_BC := cur_1.STV_FROM_DATE;
STV_FROM_DATEBCKUP:=to_date(STV_FROM_DATE_BC,'DD:MM:YY:HH24:MI:SS');
dbms_output.put_line(STV_FROM_DATEBCKUP);

得到的结果是:

01-JAN-00
01-JAN-00
01-JAN-00

谁能帮我解决这个问题并将时间戳附加字符转换为日期?

4

1 回答 1

2

DBMS_OUTPUTDISPLAY。因此,要显示DATE,您需要TO_CHAR

STV_FROM_DATEBCKUP:=to_date(STV_FROM_DATE_BC,'DD:MM:YY:HH24:MI:SS'); dbms_output.put_line(STV_FROM_DATEBCKUP);

永远不要使用YY,总是提到 4 位数的YYYY来表示完整的年份。您不想再次引入Y2K错误。上面,您尝试显示日期值,但没有提及要显示的格式模型。所以只需使用 TO_CHAR 和适当的格式模型。

原因如果不提​​供正确的格式模型,您的客户端将仅根据您的语言环境特定的 NLS 设置进行显示。例如,如果我只显示 sysdate,我会在v$parameters中看到NLS_DATE_FORMAT中提到的格式。

SQL> select parameter, value from v$nls_parameters where parameter='NLS_DATE_FORMAT';

PARAMETER            VALUE
-------------------- --------------------
NLS_DATE_FORMAT      DD-MON-RR

SQL> select sysdate from dual;

SYSDATE
---------
27-JAN-15

SQL>

所以,我得到了27-JAN-15SYSDATE,因为我的 NLS_DATE_FORMAT 是DD-MON-RR. 您可以在系统级别或会话级别设置它。

SQL> alter session set NLS_DATE_FORMAT='DD:MM:YYYY:HH24:MI:SS';

Session altered.

SQL> select sysdate from dual;

SYSDATE
-------------------
27:01:2015:11:54:07

SQL>

因此,您可以设置您NLS_DATE_FORMAT以设置适合您的格式模型。让我们看一个测试用例 -

SQL> set serveroutput on
SQL> DECLARE
  2    STV_FROM_DATE_BC   VARCHAR2(20);
  3    STV_FROM_DATEBCKUP DATE;
  4  BEGIN
  5    STV_FROM_DATEBCKUP:= NULL;
  6    STV_FROM_DATE_BC  :='01:JAN:2000:';
  7    STV_FROM_DATE_BC  :=STV_FROM_DATE_BC||'00:00:00';
  8    dbms_output.put_line('Input date literal = '||STV_FROM_DATE_BC);
  9    STV_FROM_DATEBCKUP:=to_date(STV_FROM_DATE_BC,'DD:MON:YYYY:HH24:MI:SS');
 10    dbms_output.put_line('Date without format model = '||STV_FROM_DATEBCKUP);
 11    dbms_output.put_line('Date with proper format model = '||TO_CHAR(STV_FROM_DATEBCKUP,'DD:MM:YYYY:HH24:MI:SS'));
 12  END;
 13  /
Input date literal = 01:JAN:2000:00:00:00
Date without format model = 01-JAN-00
Date with proper format model = 01:01:2000:00:00:00

PL/SQL procedure successfully completed.

SQL>
于 2015-01-27T06:11:56.600 回答