如果不存在,在 oracle 11g 中设置 NLS_DATE_FORMAT 以截断时间

asi*_*haq 0 sql oracle plsql

我在 PLSQL 中有一个 SELECT 查询,它包含多个 DATE 列,其中一些列还包含 TIME。日期和时间必须以标准格式显示,即;DD/MM/YYYY HH:MI:SS AM所以在执行查询之前我设置了 NLS_DATE_FORMAT 参数:

ALTER SESSION SET NLS_DATE_FORMAT = 'DD/MM/YYYY HH:MI:SS AM';

这里的问题是那些只有日期(没有时间)的列也在结果集中显示默认时间,即;中午 12:00:00

在此处输入图片说明

oracle 有没有办法设置 NLS_DATE_FORMAT 参数,如果它不存在于 DATE 文件中,它会截断默认时间?

请注意,我知道 TO_CHAR 和 TRUNC 之类的方法可以实现所需的结果,但在我的情况下,我无法使用这些方法,因为它会影响我的应用程序中的数据排序。

Rob*_*dez 5

NLS_SETTINGS 无法实现这一点。NLS_DATE_FORMAT 指定与 TO_CHAR 和 TO_DATE 函数一起使用的默认日期格式,并应用于每一列。该参数的默认值由 NLS_TERRITORY 决定。

该参数的值可以是任何有效的日期格式掩码,并且该值必须用双引号引起来。

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>
Run Code Online (Sandbox Code Playgroud)

你必须应用一些函数( TRUNC 或 TO_CHAR )才能实现你想要的。Oracle 总是存储时间。