他のアイデアに若干のばらつきが日付として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;
私は密接にクエリの試みを見ていませんでした。それはすでに働いているようですので、あなたは何を探していますか?または、null値の問題がありますか(見落としてしまったのは、サンプルデータと結果に何も含まれていないためです)。 –