获取日期范围内某一天的日期

时间:2014-04-13 19:04:10

标签: sql postgresql date-range generate-series

我需要PostgreSQL中的一个函数接受一个日期范围并返回星期一的日期范围内的日期。任何人都知道如何做到这一点?

2 个答案:

答案 0 :(得分:2)

create function f(dr daterange)
returns setof date as $$
    select d::date
    from generate_series(
        lower(dr), upper(dr), interval '1 day'
    ) s (d)
    where
        extract(dow from d) = 1 and
        d::date <@ dr;
    ;
$$ language sql;

select f(daterange('2014-01-01', '2014-01-20'));
     f      
------------
 2014-01-06
 2014-01-13

答案 1 :(得分:2)

最有效的方法应该是找到第一个星期一,并按照7天的步骤生成一系列:

CREATE OR REPLACE FUNCTION f_mondays(dr daterange)
  RETURNS TABLE (day date) AS
$func$
SELECT generate_series(a + (8 - EXTRACT(ISODOW FROM a)::int) % 7
                     , z
                     , interval '7 days')::date
FROM  (
   SELECT CASE WHEN lower_inc(dr) THEN lower(dr) ELSE lower(dr) + 1 END AS a
        , CASE WHEN upper_inc(dr) THEN upper(dr) ELSE upper(dr) - 1 END AS z
   ) sub
$func$ LANGUAGE sql;
  • 子查询提取范围的开始(a)和结束(z),针对包含范围和排他范围进行调整with range functions.

  • 表达式(8 - EXTRACT(ISODOW FROM a)::int) % 7返回下一个星期一之前的天数。 0如果已经是周一了。 The manual about EXTRACT().

  • generate_series()可以迭代任何给定的时间间隔 - 在这种情况下为7天。结果为timestamp,因此我们转为date

  • 仅生成范围内的星期一,不需要WHERE条款。

呼叫:

SELECT day FROM f_mondays('[2014-04-14,2014-05-02)'::daterange);

返回:

day
----------
2014-04-14
2014-04-21
2014-04-28

SQL Fiddle.