「2つの日付の間」を定義する必要があります より密接に。下限と上限は含まれていますか、それとも除外されていますか?一般的な定義は、含めるです。 下部および除外 間隔の上限。さらに、下限と上限が同じである場合、結果を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日の間隔には、常に1つの日曜日が含まれます。
単純な整数除算(日/ 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
、dow
ではありません EXTRACT()
の場合 。
含める 上限は、z - a
を置き換えるだけです (z - a) + 1
を使用 。 (演算子の優先順位により、括弧なしで機能しますが、明確にすることをお勧めします。)
パフォーマンス特性はO(1) (一定) O(N)で生成されたセットの条件付き集計とは対照的 。
関連:
- PostgreSQLを使用して前月の最終日を特定するにはどうすればよいですか?
- PostgreSQLで2つの日付の間の労働時間を計算します