首页 > 解决方案 > 在 oracle 11g 中设置 NLS_DATE_FORMAT 以截断时间(如果不存在)

问题描述

我在 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 之类的方法可以实现所需的结果,但在我的情况下,我不能使用这些方法,因为它会影响我的应用程序中的数据排序。

标签: sqloracleplsql

解决方案


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>

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


推荐阅读