找到给定月份的最后一个星期六

时间:2021-02-10 09:53:40

标签: sql postgresql date-arithmetic

有谁知道我怎样才能找到给定月份的最后一个星期六?假设给定月份是三月。

2 个答案:

答案 0 :(得分:3)

没有内置函数可以做到这一点。但是您可以创建自己的函数。

create function last_weekday(p_date date, p_weekday int)
  returns date
as
$$
  select t.d::date
  from generate_series(date_trunc('month', p_date) + interval '1 month -8 day', 
                       date_trunc('month', p_date) + interval '1 month -1 day', interval '1 day') as t(d)
  where extract(isodow from d) = p_weekday
  order by t.d desc
  limit 1
$$
language sql
immutable
; 

要获取该值,请传入您要为其获取工作日的月份内的任何日期。

这个想法是生成一个给定月末的日期列表,提取那些落在给定工作日的日期(使用 ISO 工作日数字,其中 6 = 星期六)并返回该值。

表达式 date_trunc('month', p_date) + interval '1 month -1 day' 返回给定月份的最后一天。从那天起返回 7 天将包括每个工作日至少一次。

所以要获得 2021 年 3 月的最后一个星期六,请使用:

select last_weekday(date '2021-03-07', 6);

更新:Gordon 的回答激发了我的不同实现:

date_trunc('week', ..) 返回一周中的星期一,减去 2 天将返回星期日:

create function last_saturday(p_date date)
  returns date
as
$$
  select date_trunc('week', date_trunc('month', p_date) + interval '1 month -1 day'):: date - 2;
$$
language sql
immutable; 

答案 1 :(得分:0)

Postgres 从星期日开始编号。这实际上可以非常简单地找到最后一个星期六:计算下个月第一天的星期几。从该日期减去 extract(dow) 返回的天数:

select (date_trunc('month', v.dte) + interval '1 month' -
        (extract(dow from date_trunc('month', v.dte + interval '1 month')) + 1) * interval '1 day'
       ) as last_saturday
from (values ('2020-10-01'::date)) v(dte)
相关问题