如何在ORACLE中将此表达式更改为日期

时间:2017-08-01 21:24:24

标签: oracle12c

如果以下MMM d, yyyy是ORACLE中的日期列,我如何更改以下表达式以格式act_start_date_time为我提供输出。

select DECODE(MAX(A.NAME), NULL, NULL, max(act_start_date_time))

1 个答案:

答案 0 :(得分:1)

如果act_start_date_time是数据类型date的列,则不应将其传递给to_date()函数。如果你这样做:

to_date(act_start_date_time, 'YYYY/MON/DD HH:MI:SS') 

然后您使用会话的NLS设置隐式地将日期转换为字符串,所以它确实是:

to_date(to_char(act_start_date_time), 'YYYY/MON/DD HH:MI:SS') 

to_date(to_char(act_start_date_time, <NLS_DATE_FORMAT>), 'YYYY/MON/DD HH:MI:SS') 

这将导致错误,给您相同的日期,或者给您一个不同的日期,具体取决于您当前的NLS_DATE_FORMAT是什么以及您正在查看的原始值。例如:

alter session set nls_date_format = 'DD-MON-RR';
select to_date(sysdate, 'YYYY/MON/DD HH:MI:SS') from dual;

TO_DATE(S
---------
17-AUG-02

所以2017-08-02已被翻译为[20] 02-08-17。哪个没用。

要将日期转换为格式化字符串,您需要使用to_char()功能,例如类似的东西:

decode(max(a.name),null,null, to_char(max(rca.act_start_date_time), 'YYYY/MON/DD HH:MI:SS'))

to_char(case when max(a.name) is not null then max(rca.act_start_date_time) end, 'YYYY/MON/DD HH:MI:SS')

或获取您首次询问的使用格式掩码'FMMon DD, YYYY'的格式。 FM修饰符从日期编号中删除前导零。但是对于所有这些,请注意NLS设置仍然有效;缩写的月份名称将显示在会话的日期语言中;如果您需要确保它始终以特定语言显示,您可以将其作为该函数的可选第三个参数提供:

select to_char(sysdate, 'FMMon DD, YYYY', 'NLS_DATE_LANGUAGE=ENGLISH') from dual;

TO_CHAR(SYSDATE,'FMMO
---------------------
Aug 2, 2017

select to_char(sysdate, 'FMMon DD, YYYY', 'NLS_DATE_LANGUAGE=FRENCH') from dual;

TO_CHAR(SYSDATE,'FMMONDD,YYYY
-----------------------------
Août 2, 2017

使用来自CTE的假数据并依赖会话语言的快速演示:

with a (id, name) as (select 1, null from dual union all select 2, 'Joe' from dual),
rca (id, act_start_date_time) as (select 1, sysdate from dual union all select 2, sysdate from dual)
select a.id,
  max(a.name),
  decode(max(a.name), null, null,
    to_char(max(rca.act_start_date_time), 'YYYY/MON/DD HH:MI:SS')) as string1,
  to_char(case when max(a.name) is not null then max(rca.act_start_date_time) end,
     'YYYY/MON/DD HH:MI:SS') as string2,
  to_char(case when max(a.name) is not null then max(rca.act_start_date_time) end,
     'FMMon DD, YYYY') as string3
from a
join rca on rca.id = a.id
group by a.id;

        ID MAX STRING1              STRING2              STRING3              
---------- --- -------------------- -------------------- ---------------------
         1                                                                    
         2 Joe 2017/AUG/02 11:03:47 2017/AUG/02 11:03:47 Aug 2, 2017          

(如果没有您的表格结构或示例数据,我无法评论聚合和转换是否合适,因此请根据您的实际情况进行调整...)

日期格式模型are listed in the documentation