要查找两个日期之间的天数,我们可以使用以下内容:
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