在PostgreSQL中从间隔获取某些特定日期(周末)的数量

Ole*_*Ole 3 postgresql intervals dayofweek

在postgres中给出2个时间戳,如何在不计算整个星期六和星期日的情况下计算时差?

要么

你如何计算给定时间间隔内的星期六和星期日的数量?

Kou*_*rev 5

以下函数返回两个日期之间的完整周末天数.由于需要整天,您可以在调用函数之前将时间戳转换为日期.如果第一个日期不严格在第二个日期之前,则返回0.

CREATE FUNCTION count_full_weekend_days(date, date)
  RETURNS int AS
$BODY$
  SELECT
    ($1 < $2)::int
      *
    (
      (($2 - $1) / 7) * 2
        + 
      (EXTRACT(dow FROM $1)<6 AND EXTRACT(dow FROM $2)>0 AND EXTRACT(dow FROM $1)>EXTRACT(dow FROM $2))::int * 2
        +
      (EXTRACT(dow FROM $1)=6 AND EXTRACT(dow FROM $2)>0)::int
        +
      (EXTRACT(dow FROM $2)=0 AND EXTRACT(dow FROM $1)<6)::int
    );
$BODY$
  LANGUAGE 'SQL' IMMUTABLE STRICT;
Run Code Online (Sandbox Code Playgroud)

例子:

SELECT COUNT_FULL_WEEKEND_DAYS('2009-04-10', '2009-04-20');
# returns 4

SELECT COUNT_FULL_WEEKEND_DAYS('2009-04-11', '2009-04-20');
# returns 3 (11th is Saturday, so it shouldn't be counted as full day)

SELECT COUNT_FULL_WEEKEND_DAYS('2009-04-12', '2009-04-20');
# returns 2 (12th is Sunday, so it shouldn't be counted as full day)

SELECT COUNT_FULL_WEEKEND_DAYS('2009-04-13', '2009-04-20');
# returns 2
Run Code Online (Sandbox Code Playgroud)

要获得除整个周末天数之外的天数,只需从上面的函数中减去天数:

SELECT
  '2009-04-20'::date
    -
  '2009-04-13'::date
    -
   COUNT_FULL_WEEKEND_DAYS('2009-04-13', '2009-04-20');
Run Code Online (Sandbox Code Playgroud)