2016-12-10 28 views
0

過去に同じ月と日を取得したすべてのレコードを検索したい日付が見つかりました。 同じ年にそのような日付がない場合に問題が発生します。例えば、2月29日。postgreSQL:nullでない最も近い日付を選択する方法

私の目標は、最も近い日付を存在しない日付より下に取得することです。

SELECT date, amount 
FROM table_name 
WHERE 
    EXTRACT(MONTH FROM date) = EXTRACT(MONTH FROM DATE('2012-02-29')) 
    AND EXTRACT(DAY FROM date) = EXTRACT(DAY FROM DATE('2012-02-29')) 
    AND date < '2012-02-29' 
    ORDER BY date DESC LIMIT 10; 
+0

何について: ' "日付"=日付「2016年2月29日を' - interval' 1 'year' –

+0

私は多くの日付にこのクエリを実行します。その99%はこの問題がありません。 – user5056295

+0

だから、同じ月と同じです。すべての年ですか? –

答えて

0

私が正しく理解していれば、あなたはその日が指定された日付に最も近いという性質と、年間1日にしたい:

これは私の現在の日付2012-02-29に問い合わせるあります。

私はdistinct onを使用することをお勧めします:

select distinct on (date_trunc('year', date)) t.* 
from table_name t 
order by date_trunc('year', date), 
     abs(date_part('day, (date - 
           (date '2012-02-29' - 
           (extract(year from date '2012-02-29') - extract(year from date)) * interval '1 year' 
           ) 
          ) 
          ) 
        ) 
      ); 

EDIT:

動作するコードの例:

select distinct on (date_trunc('year', date)) t.* 
from table_name t 
order by date_trunc('year', date), 
     abs(date_part('day', date - (date '2012-02-29' - 
         ((extract(year from date '2012-02-29') - extract(year from date)) * interval '1 year') 
        ) 
      )) 
+0

はpostgresで動作しません。 ' - 'は存在しない演算子です。 – user5056295

+0

@ user5056295。 。 。アイデアは機能しますが、コードはオフになっていました。今回は正しくコピーしていただきたいと思います。 –

関連する問題