已知last_day与date_part(dow,date),如何获取以周日为始的指定日期周首日?
获取以周日为起始的周第一天的解决方案
没问题!针对你需要获取给定日期所在周(周日为起始)的第一天这个需求,我给你几个实用的PostgreSQL解决方案:
方法一:通过星期偏移量计算
因为date_part('dow', date)返回的数值中,0代表周日、1代表周一……6代表周六。我们只需要用目标日期减去当前日期对应的dow数值天数,就能得到本周的起始周日。
示例代码:-- 直接计算写法 SELECT date '2018-02-14' - (date_part('dow', date '2018-02-14')::INT) * INTERVAL '1 day'; -- 简化写法 SELECT date '2018-02-14' - (date_part('dow', date '2018-02-14') || ' days')::INTERVAL;针对你的示例日期
2018-02-14,date_part('dow', ...)返回3(周三),减去3天后正好得到2018-02-11(周日)。方法二:利用date_trunc调整起始日
PostgreSQL默认的date_trunc('week', date)是以周一作为周起始的,我们可以先截断到周一,再往前推1天得到周日:SELECT date_trunc('week', date '2018-02-14')::DATE - INTERVAL '1 day';这个方法逻辑直观,适合习惯使用
date_trunc函数的场景。方法三:封装成自定义函数(复用场景)
如果需要频繁使用这个逻辑,可以封装成一个自定义函数,调用起来更方便:CREATE OR REPLACE FUNCTION week_start_sunday(p_date DATE) RETURNS DATE AS $$ BEGIN RETURN p_date - (date_part('dow', p_date)::INT) * INTERVAL '1 day'; END; $$ LANGUAGE plpgsql IMMUTABLE;使用时直接传入日期即可:
SELECT week_start_sunday('2018-02-14'); -- 返回结果:2018-02-11
内容的提问来源于stack exchange,提问作者user8834780
相关产品推荐
相关产品推荐

