postgresql – 如何计算Postgres中两个日期之间的星期日以外的天数?

前端之家收集整理的这篇文章主要介绍了postgresql – 如何计算Postgres中两个日期之间的星期日以外的天数?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
要查找两个日期之间的天数,我们可以使用以下内容
SELECT date_part('day',age('2017-01-31','2017-01-01')) as total_days;

在上面的查询中,我们得到30作为输出而不是31.为什么?
而且我还想找到星期日以外的天数.间隔的预期输出(‘2017-01-01′,’2017-01-31’):

Total Days = 31
Total Days except Sundays = 26
您需要更密切地定义“两个日期之间”.包括或排除下限和上限?通常的定义是包括较低的并排除间隔的上限.另外,当下限和上限相同时,将结果定义为0.这个定义恰好与日期减法一致.
SELECT date '2017-01-31' - date '2017-01-01' AS days_between

这个确切的定义对于排除星期日非常重要.对于给定的定义,Sun – Sun(1周后)的间隔不包括上限,因此只有1个星期日要减去.

interval in days  | sundays
0                 | 0
1-6               | 0 or 1
7                 | 1
8-13              | 1 or 2
14                | 2
...

7天的间隔总是包括一个星期天.

我们可以使用普通整数除法(天/ 7)得到最小结果,这会截断结果.

剩余1至6天的额外星期日取决于间隔的第一天.如果是星期天,宾果游戏;如果是星期一,太糟糕了.等等.我们可以从中得出一个简单的公式:

SELECT days,sundays,days - sundays AS days_without_sundays
FROM  (
   SELECT z - a AS days,((z - a) + EXTRACT(isodow FROM a)::int - 1 ) / 7 AS sundays
   FROM  (SELECT date '2017-01-02' AS a       -- your interval here,date '2017-01-30' AS z) tbl
   ) sub;

适用于任何给定的间隔.
注意:isodow,not dow for EXTRACT().

要包含上限,只需将z – a替换为(z – a)1.(由于运算符优先级,可以不使用括号,但最好清楚.)

性能特征是O(1)(常数),而不是具有O(N)的生成集合上的条件聚合.

有关:

> How do I determine the last day of the previous month using PostgreSQL?
> Calculate working hours between 2 dates in PostgreSQL

猜你在找的Postgre SQL相关文章