sql >> データベース >  >> RDS >> PostgreSQL

Postgresの2つの日付の間の日曜日を除く日数を数える方法は?

    「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;
    

    すべてで機能します 指定された間隔。
    注:isodowdowではありません EXTRACT()の場合 。

    含める 上限は、z - aを置き換えるだけです (z - a) + 1を使用 。 (演算子の優先順位により、括弧なしで機能しますが、明確にすることをお勧めします。)

    パフォーマンス特性はO(1) (一定) O(N)で生成されたセットの条件付き集計とは対照的 。

    関連:

    • PostgreSQLを使用して前月の最終日を特定するにはどうすればよいですか?
    • PostgreSQLで2つの日付の間の労働時間を計算します


    1. SQLiteにGLOB句が必要なのはなぜですか?

    2. MySQLのT-SQLのWITHTIESの代替

    3. アプリケーションユーザーと行レベルのセキュリティ

    4. 64ビットアプリケーションをClarionTopSpeedに接続する