sql - 在 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 之类的方法可以实现所需的结果,但在我的情况下,我不能使用这些方法,因为它会影响我的应用程序中的数据排序。
解决方案
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 总是存储时间。
推荐阅读
- python - 双向 OneToOne 关系 - Django
- r - 如何在 R 的单个图中绘制一个图以查看两个独立样本的 SEM?
- python - 将 datetime ns 转换为每日格式
- algorithm - 使用递归和回溯的 SubsetSum
- c# - 将字节数组转换为具有下限和上限的整数
- locking - QThread - 更改全局列表中的数据 - 不同的值
- html - 如何双击勾选复选框?
- linux - 安装作曲家(权限被拒绝) Symfony
- eclipse-hono - 将 Eclipse Hono 连接到同上 - "description":"检查是否设置了所有必需的 JSON 字段。"},"status":400}" 错误
- chef-infra - Chef [version-13.0.17] - 错误:无法将报告数据发布到服务器 (HTTP 400)