有谁知道我怎样才能找到给定月份的最后一个星期六?假设给定月份是三月。
答案 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)