2011-08-03 12 views
16
私はplpgsqlが、以下の取得しようとしています

に月の日数を取得する方法:があることに建てられた任意の私が行方不明ですpostgresqlの

select day_in_month(2); 

の予想される出力

28 

をそれをするポストグルで?

+2

あなたの例に関しては、うるう年について聞いたことがありますか(またはこれが現在の*年度のものであるという暗黙の前提がありますか)。 – NPE

答えて

27
SELECT 
    DATE_PART('days', 
     DATE_TRUNC('month', NOW()) 
     + '1 MONTH'::INTERVAL 
     - '1 DAY'::INTERVAL 
    ) 

代替番号NOW()他の日付と置き換えてください。

+10

私は2番目の 'DATE_TRUNC( 'month'、NOW())'を '' 1day ':: interval'に置き換えます。 – sayap

+2

@dapapの修正が重要です。解決策は 'NOW() 'の代わりに悪い結果(' '2006-04-30' :: date'を試してみてください)につながる可能性があります –

1

うるう年のため、day_in_month(2)の予想される出力は29になることに注意してください。あなたはintの代わりに日付を渡すこともできます。

また、夏時間の用心:タイムゾーンを削除するか、他のいくつかのmonthesの計算は、(CET/CESTに次の例)間違っている可能性:

SELECT DATE_TRUNC('month', '2016-03-12'::timestamptz) + '1 MONTH'::INTERVAL 
     - DATE_TRUNC('month', '2016-03-12'::timestamptz) ; 
------------------ 
30 days 23:00:00 

SELECT DATE_TRUNC('month', '2016-03-12'::timestamp) + '1 MONTH'::INTERVAL 
     - DATE_TRUNC('month', '2016-03-12'::timestamp) ; 
---------- 
31 days 
0

これは、同様に動作します。

WITH date_ AS (SELECT your_date AS d) 
SELECT d + INTERVAL '1 month' - d FROM date_; 

それとも:

SELECT your_date + INTERVAL '1 month' - your_date; 

これらの2つの戻り間隔、ない整数

-1
SELECT cnt_dayofmonth(2016, 2); -- 29 


create or replace function cnt_dayofmonth(_year int, _month int) 
returns int2 as 
$BODY$ 
-- ZU 2017.09.15, returns the count of days in mounth, inputs are year and month 
declare 
    datetime_start date := ('01.01.'||_year::char(4))::date; 
    datetime_month date := ('01.'||_month||'.'||_year)::date; 
     cnt int2; 
begin 
    select extract(day from (select (datetime_month + INTERVAL '1 month -1 day'))) into cnt; 

    return cnt; 
end; 
$BODY$ 
language plpgsql; 
+0

コードだけの回答は将来の読者のために多くの情報を提供しないので励まされませんあなたが書いたことを説明してください – WhatsThePoint