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