2017-06-17 19 views
1

My DBには期間(月)と年が含まれています。これを日付に変換しようとしています。私は月の実際の日を気にしないので、私はちょうどそれを "1"(月の1日)にしました。日付を返すSQLクエリ

私のコードでは、12ヶ月のために "13番目"の期間を12日に変換しなければならなかったので、私のデコードはその部分でした...最終的に、私はそれを日付として戻したいと思います。私はそれを日付のように「見える」ようにするために連結を持っていますが、実際には日付ではありません。

私はデータをクエリし、それをExcelで返してさらに操作します。 Excelにインポートすると、日付としてインポートされたり、日付形式に変換されたりしません。

SELECT DIA_PROJECT_DETAIL.FY_DC || '/' || 
    decode(DIA_PROJECT_DETAIL.PER_DC,1,1,2, 2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,12)|| 
    '/01' as "Date" 
FROM AMS.DIA_PROJECT_DETAIL DIA_PROJECT_DETAIL 

これを行うには、より簡単で効果的な方法が必要です。

+0

FY_DCとPER_DCフィールドのいくつかのサンプルデータを提供してください。 – SandPiper

+1

質問にはまったく関係ありませんが、値が13まで上がると「期間」は「月」となります。彼らは4週間の期間を言っていないのですか?そして/または暦月から相殺されましたか? –

+1

はい、期間は月です。 13日の「月」は、12月の期間には行かないが、年間に属していないぎこちないエントリーをキャプチャすることです - チームは13日のアイデアを思いついて、次の1月にこれらのエントリーを作ることができます。 - 良いフォローアップの質問。 – davidij

答えて

1

もっと簡単な方法はありません。 DECODEは13ヶ月から12ヶ月に変換しても問題ありませんが、少し複雑すぎます。次にセッション設定に頼るべきではありませんが、明示的にDBMSにあなたの擬似文字列が表す日付形式を伝えてください。適切な形式のTO_DATEを使用してください。

select 
    to_date(fy_dc || to_char(decode(per_dc, 13, 12, per_dc), '00') || '01', 'yyyymmdd') 
    as "Date" 
from ams.dia_project_detail dia_project_detail; 
+0

これは完全に機能しました - 新しいコーダーとして、私は質問を複雑にしていると思います。助けてくれてありがとう! – davidij

0

だけleast()を使用します。

SELECT (DIA_PROJECT_DETAIL.FY_DC || '/' || 
     LEAST(DIA_PROJECT_DETAIL.PER_DC, 12) || 
     '/01' 
     ) as "Date" 
FROM AMS.DIA_PROJECT_DETAIL DIA_PROJECT_DETAIL;