在oracle11g中设置nls\u date\u格式,以便在时间不存在时截断时间

brvekthn  于 2021-07-24  发布在  Java
关注(0)|答案(3)|浏览(298)

我在plsql中有一个select查询,它包含多个日期列,其中一些还包含时间。日期和时间必须以标准格式显示,即:;dd/mm/yyyy hh:mi:ss am so在执行查询之前,我设置nls\u date\u format参数: ALTER SESSION SET NLS_DATE_FORMAT = 'DD/MM/YYYY HH:MI:SS AM'; 这里的问题是那些只有日期(没有时间)的列在结果集中也显示了一个默认时间,即;上午12:00:00

在oracle中,是否有一种方法可以设置nls\u date\u format param,如果默认时间不在日期字段中,它会截断默认时间?
请注意,我知道使用char和trunc等方法可以获得所需的结果,但在我的情况下,我不能使用这些方法,因为这将影响应用程序中的数据排序。

tf7tbtn2

tf7tbtn21#

没有办法通过nls\U设置来实现这一点。nls\u date\u format指定要与to\u char和to\u date函数一起使用的默认日期格式,并应用于每一列。此参数的默认值由nls\U区域确定。
此参数的值可以是任何有效的日期格式掩码,并且该值必须用双引号括起来。
oracle总是存储时间,但只要指定的日期格式提供日期/时间掩码,它就会显示时间
例子

SQL> create table mytest ( c1 date ) ;

Table created.

SQL> insert into mytest values ( to_date ( '22/07/2020 11:25:00 AM' , 'DD/MM/YYYY HH:MI:SS AM' ) ) ;

1 row created.

SQL> insert into mytest values ( to_date ( '22/07/2020' , 'DD/MM/YYYY' ) ) ;

1 row created.

SQL> select * from mytest ;

C1
---------
22-JUL-20
22-JUL-20

SQL> select value from nls_database_parameters where parameter = 'NLS_DATE_FORMAT' ;

VALUE
--------------------------------------------------------------------------------
DD-MON-RR

SQL> alter session set nls_date_format = 'DD/MM/YYYY HH:MI:SS AM';

Session altered.

SQL> select * from mytest ;

C1
----------------------
22/07/2020 11:25:00 AM
22/07/2020 12:00:00 AM

SQL>

你必须应用一些函数(trunc或tou char)来实现你想要的。甲骨文总是储存时间。

kiayqfof

kiayqfof2#

oracle日期(只要我们讨论的是实际日期而不仅仅是文本)总是有一个时间组件。
我怀疑这种混乱是因为你能吃东西 DATE 包含日期但不包含时间的文本的列。这里真正发生的是ansi日期文字和 TO_DATE() 函数只会为缺少的组件存储一个默认值。在这种情况下,午夜:

create table test (
    id int not null,
    value date not null,
    primary key (id)
);
insert into test (id, value) values (1, date'2020-07-22');
insert into test (id, value) values (2, to_date('2020-07-22', 'YYYY-MM-DD'));
select id, value as default_format, to_char(value, 'YYYY-MM-DD HH24:MI:SS') as custom_format
from test;

(演示)
如果您真的需要它,您可以编写一个自定义格式函数,检查时间是否为午夜并忽略它,但当然,无法判断该值是默认值还是以这种方式显式输入的实际数据的一部分。

piok6c0g

piok6c0g3#

通过指定所需的日期格式而不依赖nls\ U date\ U格式,可以很容易地实现这一点。此外,您还可以有条件地将结果格式设置为yes sort date/time。

with x (date_col) as 
    ( select trunc(sysdate) from dual union all 
      select sysdate - 1 from dual
    )
 select  
        case when to_char(date_col, 'hh24:mi:ss') = '00:00:00' 
             then to_char(date_col, 'yyyy-mm-dd')
             else to_char(date_col, 'yyyy-mm-dd hh:mi:ss am')
        end date_col
   from x 
  order by date_col;

相关问题