3

PostgreSQL で特定の月の最後の平日を見つける

使用法: 月末が土曜日または日曜日の場合は前の金曜日を返し、それ以外の場合は月末を使用します

例:

  • 2013 年 3 月 31 日は日曜日なので、2013 年 3 月 29 日を返します。
  • 2013 年 11 月 30 日は土曜日なので、2013 年 11 月 29 日を返します。

これをPostgreSQL SQLでどのように書くのですか?

私がこれまでに持っているのはこれです(月末のみを返しますが、土曜日または日曜日にあたる場合、月末は存在しません):

SELECT as_of_dt, sum(bank_shr_bal) as bank_shr_bal 
  FROM hm_101.vw_gl_bal 
 WHERE as_of_dt = (date_trunc('MONTH', as_of_dt) + INTERVAL '1 MONTH - 1 day')::date 
GROUP BY 1

ありがとう

4

6 に答える 6

1

カレンダー テーブルは、このようなクエリの SQL を大幅に簡素化します。(テーブル「weekdays」は、実際にはカレンダー テーブルに基づくビューです。その構造は明白なはずです。)

select max(cal_date)
from weekdays
where cal_date < '2013-05-01'

また

select max(cal_date)
from weekdays
where cal_date between '2013-04-01' and '2013-04-30'
于 2013-04-11T15:52:45.193 に答える
0

1 つの解決策は、CTE を使用して、データの月ごとの最終日と、各月の実際の最終日を見つけることです。

WITH s1
as
(
SELECT 
 date_part('YEAR', as_of_dt) AOD_Year
,date_part('MONTH', as_of_dt) AOD_Month
,(date_trunc('MONTH', as_of_dt) + INTERVAL '1 MONTH - 1 day')::date AOD_MonthEnd
,max(as_of_dt) AOD_LastFound
  FROM hm_101.vw_gl_bal
where (date_trunc('MONTH', as_of_dt) + INTERVAL '1 MONTH - 1 day')::date = '2013-03-31'
 group by 1, 2, 3
)
SELECT 
 s1.AOD_MonthEnd
,s1.AOD_LastFound
,sum(v.bank_shr_bal) as bank_shr_bal 
  FROM hm_101.vw_gl_bal v
 INNER JOIN s1
    on v.as_of_dt = s1.AOD_LastFound
 WHERE v.as_of_dt = '2013-03-29'  
 GROUP BY 1, 2 
于 2013-04-11T14:48:53.800 に答える
0
select 
case
  when extract(dow from first_day_of_month) = 0 then first_day_of_month 
  when extract(dow from first_day_of_month) = 1 then first_day_of_month - 1
  when extract(dow from first_day_of_month) = 2 then first_day_of_month - 2
  when extract(dow from first_day_of_month) = 3 then first_day_of_month - 3
  when extract(dow from first_day_of_month) = 4 then first_day_of_month - 4
  when extract(dow from first_day_of_month) = 5 then first_day_of_month - 5
  when extract(dow from first_day_of_month) = 6 then first_day_of_month - 6
  end as first_weekday_of_month,
case 
  when extract(dow from last_day_of_month)  = 6 then last_day_of_month 
  when extract(dow from last_day_of_month)  = 5 then last_day_of_month - 6 
  when extract(dow from last_day_of_month)  = 4 then last_day_of_month - 5 
  when extract(dow from last_day_of_month)  = 3 then last_day_of_month - 4 
  when extract(dow from last_day_of_month)  = 2 then last_day_of_month - 3 
  when extract(dow from last_day_of_month)  = 1 then last_day_of_month - 2 
  when extract(dow from last_day_of_month)  = 0 then last_day_of_month - 1
  end as last_weekday_of_month
from(
  SELECT   
    (date_trunc('month', current_date) -'7day'::interval)::date first_day_of_month,
    (date_trunc('month', current_date) -'1day'::interval)::date as last_day_of_month
)subquery;
于 2013-12-11T12:19:54.203 に答える