我在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等方法可以获得所需的结果,但在我的情况下,我不能使用这些方法,因为这将影响应用程序中的数据排序。
3条答案
按热度按时间tf7tbtn21#
没有办法通过nls\U设置来实现这一点。nls\u date\u format指定要与to\u char和to\u date函数一起使用的默认日期格式,并应用于每一列。此参数的默认值由nls\U区域确定。
此参数的值可以是任何有效的日期格式掩码,并且该值必须用双引号括起来。
oracle总是存储时间,但只要指定的日期格式提供日期/时间掩码,它就会显示时间
例子
你必须应用一些函数(trunc或tou char)来实现你想要的。甲骨文总是储存时间。
kiayqfof2#
oracle日期(只要我们讨论的是实际日期而不仅仅是文本)总是有一个时间组件。
我怀疑这种混乱是因为你能吃东西
DATE
包含日期但不包含时间的文本的列。这里真正发生的是ansi日期文字和TO_DATE()
函数只会为缺少的组件存储一个默认值。在这种情况下,午夜:(演示)
如果您真的需要它,您可以编写一个自定义格式函数,检查时间是否为午夜并忽略它,但当然,无法判断该值是默认值还是以这种方式显式输入的实际数据的一部分。
piok6c0g3#
通过指定所需的日期格式而不依赖nls\ U date\ U格式,可以很容易地实现这一点。此外,您还可以有条件地将结果格式设置为yes sort date/time。