2017-12-07 10 views
0

2つのフィールドを連結し、データを日付フィールドに読み込もうとしています。日付と文字 '時刻'フィールドを単一の日付に変換する

Iのようなデータを用いて、hier_dtDATEようなデータ型とhier_tmCHARようなデータ型を持つテーブルを持っている:私が生成する、単一DATEデータ型のフィールドにこれらの両方を連結したい

hier_dt | hier_tm 
16-JAN-17 | 16:54 
16-JAN-17 | 16:54 
16-JAN-17 | 16:54 
16-JAN-17 | 16:54 
17-JAN-17 | 17:54 

hier_dt_tm 
---------------- 
2017/01/16 16:54 
2017/01/16 16:54 
2017/01/16 16:54 
2017/01/16 16:54 
2017/01/17 17:54 

これを達成する方法はありますか?

私の現在のクエリは次のとおりです。

select to_date(concat(to_char(NVL(hier_DT,'01-JAN-1900'), 'yyyy/mm/dd'), 
    concat(' ',NVL(hier_tm,'00:00'))), 'yyyy/mm/dd hh24:mi') as temp 
from XXX1 
+0

私は密接にクエリの試みを見ていませんでした。それはすでに働いているようですので、あなたは何を探していますか?または、null値の問題がありますか(見落としてしまったのは、サンプルデータと結果に何も含まれていないためです)。 –

答えて

3

他のアイデアに若干のばらつきが日付としてhier_dtを残し、そしてhier_tmが表す日の割合を把握することです。明示的で

hier_dt + (to_date(hier_tm, 'HH24:MI') - trunc(sysdate, 'MM') 

:その後、hier_dtに結果を追加し、その最初からを引き、 - デフォルトは現在の月の最初に他のすべて - それを行うための一つの方法は、現在までに時間だけを変換することです単に表示のための文字列に戻って書式設定:

select to_char(
    hier_dt + (to_date(hier_tm, 'HH24:MI') - trunc(sysdate, 'MM')), 
    'YYYY/MM/DD HH24:MI') as temp 
from xxx1; 

TEMP    
---------------- 
2017/01/16 16:54 
2017/01/16 16:54 
2017/01/16 16:54 
2017/01/16 16:54 
2017/01/17 17:54 

さらにもう1つの方法は、機能、文字列何かを作るためにダミーの日と第二の値にタックが含まto_dsinterval()機能を使用して、間隔データ型に時間を変換することです認識:

NLS設定に代わりに頼るの文字列を明示的に変換せずに0
hier_dt + to_dsinterval('0 ' || hier_tm || ':00') 

この時、:私にとって

alter session set nls_date_format = 'YYYY/MM/DD HH24:MI'; 

select hier_dt + to_dsinterval('0 ' || hier_tm || ':00') as temp 
from xxx1; 

TEMP    
---------------- 
2017/01/16 16:54 
2017/01/16 16:54 
2017/01/16 16:54 
2017/01/16 16:54 
2017/01/17 17:54 

を、このアプローチは、理解の面で最も明白ですが、コードは、やろうとしているものおそらく一見してもそれを完全にはっきりさせることはできません。


問題のクエリの試みはさておき、あなたのNLS設定と日付に'01-JAN-1900'の暗黙的な変換に依存するから、動作しているようです。それは単純化することができ、私はまだ私のアプローチ(明らかに!)を好むだろう。私はnull値の処理を逃してしまいました。だから、どちらかの列にnull値を扱うのバージョン:

select coalesce(hier_dt, date '1900-01-01') 
    + case when hier_tm is null then 0 
     else (to_date(hier_tm, 'HH24:MI') - trunc(sysdate, 'MM')) end as temp 
from xxx1; 

または

select coalesce(hier_dt, date '1900-01-01') 
    + to_dsinterval('0 ' || coalesce(hier_tm, '00:00') || ':00') as temp 
from xxx1; 
+0

は、この 'to_char(hier_tm、 'yyyy/mm/dd')|| hier_dt'のように簡単ですが、' date'にするためには 'nls_date_format'を設定する必要があります。 –

+0

質問は、「単一のDATEデータ型」という結果が出ているので、両方のバージョンでこれを行っています。明示的な 'to_char()'の代わりに 'nls_date_format'を使用して2番目の例で表示しました。しかし、日付の変換*もNLSの設定に依存しません。 (あなたはあなたの 'tm'と' dt'を逆にする* 8-) –

+1

'trunc(sysdate、 'mm')'(これは 'to_date引数は現在の月の初日になります。現在の月の初日ではなく、「今日」ではなく)to_date('00:00 '、' HH24:MI ')を引くことができます。これは、デフォルトが一貫して適用されている限り、デフォルトに関係なく正しい結果を生成するはずです。 – mathguy

1

試してみてください。

SELECT 
/* TO_DATE(*/ 
    TO_CHAR(hier_dt, 'YYYY/MM/DD') || 
    ' ' || 
    hier_tm 
/* ,'YYYY/MM/DD HH24:MI') */ 
AS HIER_dt_tm 
FROM temp; 

http://sqlfiddle.com/#!4/6f69b/35

1

DATEに変換するために使用します。

SELECT 
    TO_DATE( TO_CHAR(hier_dt,'DD-MON-YYYY') || hier_tm , 'DD-MON-YYYY HH24:MI') HIER_dt 
FROM Yourtable; 

これを使用して、希望する形式で表示します。

SELECT 
    TO_CHAR ( TO_DATE( TO_CHAR(hier_dt,'DD-MON-YYYY') || hier_tm , 'DD-MON-YYYY HH24:MI'), 
      'YYYY/MM/DD HH24:MI') hier_dt_tm 
FROM Yourtable; 

DEMO

+0

こんにちはkaushik、それはリテラルがフォーマット文字列エラーと一致しないと言いますORA -01861 – beckham

+0

@beckham:Modified。今すぐお試しください –

+0

なぜ2桁のYYモデルを使用するのかよく分かりません。元の日付のいずれかが現在の世紀にない場合、結果は間違っていますか? –

関連する問題