如果以下MMM d, yyyy
是ORACLE中的日期列,我如何更改以下表达式以格式act_start_date_time
为我提供输出。
select DECODE(MAX(A.NAME), NULL, NULL, max(act_start_date_time))
答案 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
(如果没有您的表格结构或示例数据,我无法评论聚合和转换是否合适,因此请根据您的实际情况进行调整...)