2017-08-01 64 views
0

这种表达改变迄今为止我怎样才能改变以下表达式给我在格式MMM d, yyyy一个输出给下面act_start_date_time是Oracle日期列。如何在Oracle

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

如果它已经是一个日期,为什么标题询问其更改为一个日期吗?如果你的意思是一个字符串的格式,你显示它们与任何其他日期相同的字符转换 - 你有什么尝试?也许'MMM'应该是'Mon','D'应该是'dd'? –

+0

(选择DECODE(MAX(A.NAME),NULL,NULL,TO_DATE(MAX(RCA.act_start_date_time), 'YYYY/MON/DD HH:MI:SS'))......似乎没有工作... –

+1

“似乎不起作用”不是很有帮助;你会得到错误还是错误的结果? –

回答

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 

so 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