2016-08-25 9 views
1

で特定の日から先月の日付を取得します。どうやってやるの?例えばは、どのように私は私のクエリで最大の日付を持っていると最大の日付は現在の月である場合、私はいつも、前の月の日付を取得したいのPostgresSQL

、今日は20160825です。最大日付が20160801であれば、私は20160701を取得したいです。しかし、最大の日付が20160501の場合、私は変更なしで取得したいだけです - 20160501

SELECT 
    DEFN_DK, 
    MAX(SNAPSHOT_MTH) 
FROM myTable 
WHERE TOT_AMT >0 
GROUP BY DEFN_DK 

答えて

1

を非常に便利なtimestamp関数。だから、これは文字列にそれを変換して、それを整数にキャストしてCURRENT_DATEと比較することができ、100で整数の除算を通して、あなたのスナップショット「日」から「月」を作成、数学を整数に戻っています。同様に1ヶ月前に戻るには、数学が必要です。ない完全に効率的な、しかし、ここに行く:

SELECT DEFN_DK, 
     CASE max(SNAPSHOT_MTH)/100 
      WHEN tochar(CURRENT_DATE, 'YYYYMM')::int THEN 
       ((max(SNAPSHOT_MTH)/100) - 1) * 100 + 1 
       -- or max(SNAPSHOT_MTH) - 100, if you know it always ends in 01 
      ELSE max(SNAPSHOT_MTH) 
     END AS SNAPSHOT_MTH 
FROM myTable 
WHERE TOT_AMT > 0 
GROUP BY DEFN_DK; 
0
select 
    defn_dk, 
    case max(snapshot_mth) 
     when date_trunc('month', current_date) then max(snapshot_mth) - interval '1 month' 
     else max(snapshot_mth) 
    end   
from mytable 
where tot_amt >0 
group by defn_dk 
+0

おかげで、私はこのエラーを取得しています:一貫性のないデータ型「INT4」と「TIMESTAMP」のスナップショットが整数であるため、 – moe

0

、二つの例にこれを示しています。あなたのSNAPSHOT_MTH列はあなたがそうでない場合のいずれかを使用することはできませんinteger(?理由)であるので

select 
case when date_trunc('month',dd) = date_trunc('month',now()) 
then dd - interval'1 month' else date_trunc('day',dd) end 
from 
(
select '2016-08-04'::date as dd 
) d; 

select 
case when date_trunc('month',dd) = date_trunc('month',now()) 
then dd - interval'1 month' else date_trunc('day',dd) end 
from 
(
select '2016-05-04'::date as dd 
) d; 
関連する問題