Getting number of certain days-of-the-week (weekend) from interval in PostgreSQL

前端 未结 8 2078
轮回少年
轮回少年 2021-01-06 13:27

Given 2 timestamps in postgres, how do you calculate the time difference without counting whole Saturdays and Sundays?

OR

How do you count the number of Satu

相关标签:
8条回答
  • 2021-01-06 14:16

    You might find this really helpful:

    CREATE OR REPLACE FUNCTION working_days(date, date) RETURNS INT AS
    $$
    SELECT COUNT(days)::INT
        FROM generate_series($1, $2, '1 day') AS days
        WHERE EXTRACT(DOW FROM days) NOT IN(0, 6);
    $$
    LANGUAGE 'sql' IMMUTABLE STRICT;
    
    0 讨论(0)
  • 2021-01-06 14:28

    I suggest you to create a function for use whenever you want and write less ; )

    This code above will create a sql function that count and return the amount of weekend days (Sat, Sun) . Just the way you will have more flexibility to use this function.

    CREATE OR REPLACE FUNCTION <YourSchemaNameOptional>.count_full_weekend_days(date, date)
    RETURNS bigint AS
    $BODY$
            select  COUNT(MySerie.*) as Qtde
            from    (select  CURRENT_DATE + i as Date, EXTRACT(DOW FROM CURRENT_DATE + i) as DiaDate
                     from    generate_series(date ($1) - CURRENT_DATE,  date ($2) - CURRENT_DATE ) i) as MySerie
            WHERE   MySerie.DiaDate in (6,0);
    $BODY$
    LANGUAGE 'SQL' IMMUTABLE STRICT;
    

    After that, you can use the function to return only the number of weekend days in a interval. Here's the example to use:

    SELECT <YourSchemaNameOptional>.count_full_weekend_days('2017-09-11', '2017-09-25') as days; --> RES: 4
    

    This select must return four because the first and the second day are Monday, and we have 2 Saturdays and 2 Sundays between them.

    Now, to return only business days (without weekends), as you want, just make a subtraction, like the example below:

    SELECT (date '2017-09-25' - date '2017-09-11' ) - <YourSchemaName>.count_full_weekend_days('2017-09-11', '2017-09-25'); --> RES: 14 - 4 = 10
    
    0 讨论(0)
提交回复
热议问题