gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 11:54:08 27 4
gpt4 key购买 nike

要查找两个日期之间的天数,我们可以使用如下方法:

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) 生成集的条件聚合相反。

相关:

关于postgresql - 如何计算 Postgres 中两个日期之间除星期日以外的天数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41877136/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com