2011-08-03 202 views
16

我試圖讓PLPGSQL如下:如何獲得的天數在一個月PostgreSQL中

select day_in_month(2); 

預計輸出

28 

是否有任何內置的,我很想念在postgres做到這一點?

+2

關於您的示例,您是否聽說過閏年(或者是否存在隱含的假設,即*當前*年)? – NPE

回答

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

用任何其他日期替代NOW()

+10

我會用''1 day':: interval'替換第二個'DATE_TRUNC('month',NOW())' – sayap

+2

@ sayap的修正至關重要;該解決方案可能會導致錯誤的結果(例如,'2006-04-30':: date')代替NOW()' –

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; 

這兩個回報間隔,不整數

-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

相關問題