2017-08-01 6 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(RCA.act_start_date_time)、 'YYYY/MON/DD HH:MI:SS')を選択してください)... ... does not work ... –

+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, <NLS_DATE_FORMAT>), 'YYYY/MON/DD HH:MI:SS') 

ある

to_date(to_char(act_start_date_time), '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は[02] 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の設定がまだ有効であることに注意してください。短縮月名はセッションの日付言語で表示されます。

:偽のCTEからのデータとセッション言語に依存すると

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 

クイックデモ:あなたはことを確認する必要がある場合、それは常にあなたが関数にオプションの3番目の引数としてそれを供給することができ、特定の言語で表示されます

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

関連する問題