週末を除く2つの日付の間のCOUNT日を選択します


9

週末を除いて、2つの異なる日付の間の日数を取得しようとしています。

私はこの結果を達成する方法を知りません。


1
参照用にテーブル構造を投稿してください。週末はSATとSUNを意味しますか?
Abdul Manaf 2014年

回答:


10

「週末」とは土曜日日曜日を意味すると仮定すると、これはさらに簡単になります。

SELECT count(*) AS count_days_no_weekend
FROM   generate_series(timestamp '2014-01-01'
                     , timestamp '2014-01-10'
                     , interval  '1 day') the_day
WHERE  extract('ISODOW' FROM the_day) < 6;
  • に追加のサブクエリレベルは必要ありませんgenerate_series()。「テーブル関数」とも呼ばれるSRF(セットを返す関数)は、FROM句のテーブルと同じように使用できます。

  • 特に、完全な間隔(3番目のパラメーター)が適合する限り、出力に上限がgenerate_series() 含まれること注意してください。上限は、最後の間隔が切り捨てられる場合にのみ除外されます。これは、丸一日の場合とは異なります。

  • パターンISODOWEXTRACT()のために、日曜日はとして報告されている7ISO規格に従って、。より単純なWHERE条件を可能にします。

  • むしろ呼んgenerate_series()timestamp入力。理由は次のとおりです。

  • count(*)はよりもわずかに短くて高速ですcount(the_day)。この場合も同じです。

下限および/または上限を除外するには、それに応じて1日を加算/減算します。通常、下限を含め、上限を除外します。

SELECT count(*) AS count_days_no_weekend
FROM   generate_series(timestamp '2014-01-01'
                     , timestamp '2014-01-10' - interval '1 day'
                     , interval '1 day') the_day
WHERE  extract('ISODOW' FROM the_day) < 6;

3

この例では、2013年12月15日から2014年1月2日までのすべての日付を列挙します。2番目の列は、曜日(数値的には0から6)を示します。3番目の列は、曜日が土曜日/日曜日であるかどうかを示し(週末は何であるかを考慮する必要があります)、平日をカウントするために使用できます。

select '2013-12-15'::date + i * interval '1 day',
       extract('dow' from '2013-12-15'::date + i * interval '1 day') as dow,
       case when extract('dow' from '2013-12-15'::date + i * interval '1 day') in (0, 6)
               then false
            else true end as is_weekday
from generate_series(0, '2014-01-02'::date - '2013-12-15'::date) i
;

3

週末が土曜日と日曜日であるとすると、次のSQLを使用できます。

select count(the_day) from 
    (select generate_series('2014-01-01'::date, '2014-01-10'::date, '1 day') as the_day) days
where extract('dow' from the_day) not in (0,6)

日付を選択したものに置き換え、(0,6)を除外する曜日に置き換えます。

あなたが注意する必要があるいくつかのこと:-

  1. 実行しているPostgreSQLのバージョンについては言及していません。これは9.1以降で動作しますが、以前のバージョンでも動作するはずです。

  2. 選択した日付は、generate_seriesを使用する場合に含まれます。したがって、間に日数が必要な場合は、各日付に1日を追加します。


0

これを簡単にするためにできることがいくつかあります。私が使用する方法は、日付のテーブルが利用可能であることを確認することです。次のようにしてすばやく作成できます。

CREATE TABLE [dbo].[Dates]
(
[Id] INT NOT NULL PRIMARY KEY IDENTITY(0,1),
[Date] Date NOT NULL unique,
isWeekend BIT NOT NULL DEFAULT(0)
)

テーブルが作成されたら、日付データを比較的すばやく入力できるはずです。

set datefirst 6 --start date is saturday
INSERT INTO dbo.Dates(Date, isWeekend)
select 
    Date,
    case datepart(weekday,date) 
        --relies on DateFirst being set to 6
        when 2 then 1 
        when 1 then 1
        else 0
    end as isWeekend
from (
    select 
        dateadd(day, number - 1, 0) as date
    from (
        SELECT top 100000 row_number() over (order by o.object_id) as number
        FROM sys.objects o
            cross join sys.objects b
            cross join sys.objects c
    )numbers
)data

次に、このテーブルのレコードのクイックカウントとしてクエリを記述できます。

select count(*) as NumberOfWeekDays
from dbo.dates 
where isWeekend = 0
and date between '1 Jan 2013' and '31 Dec 2013'

0

必要なときにいつでも使用できる関数を作成し、書く回数を減らすことをお勧めします。)

上記のコードは、週末の日数(土、日)をカウントして返すSQL関数を作成します。この方法を使用すると、この機能をより柔軟に使用できます。

CREATE OR REPLACE FUNCTION <YourSchemaNameOptional>.count_full_weekend_days(date, date)
RETURNS bigint AS
$BODY$
        select  COUNT(MySerie.*) as Qtde
        from    (select  CURRENT_DATE + i as Date, EXTRACT(DOW FROM CURRENT_DATE + i) as DiaDate
                 from    generate_series(date ($1) - CURRENT_DATE,  date ($2) - CURRENT_DATE ) i) as MySerie
        WHERE   MySerie.DiaDate in (6,0);
$BODY$
LANGUAGE 'SQL' IMMUTABLE STRICT;

その後、関数使用して、間隔の週末の日数のみを返すことができます。使用例は次のとおりです。

SELECT <YourSchemaNameOptional>.count_full_weekend_days('2017-09-11', '2017-09-25') as days; --> RES: 4

この選択は、1日目と2日目が月曜日であり、その間に2つの土曜日と2つの日曜日があるため、4を返す必要があります。

ここで、必要に応じて(週末なしで)営業日のみを返すには、次の例のように減算します。

SELECT (date '2017-09-25' - date '2017-09-11' ) - <YourSchemaName>.count_full_weekend_days('2017-09-11', '2017-09-25'); --> RES: 14 - 4 = 10

-2
-- Returns number of weekdays between two dates
SELECT count(*)  as "numbers of days 
FROM generate_series(0, (‘from_date’::date - 'todate'::date)) i 
WHERE date_part('dow', 'todate'::date + i) NOT IN (0,6)


-- Returns number of weekdays between two dates
SELECT count(*)  as days 
FROM generate_series(0, ('2014/04/30'::date - '2014/04/01'::date)) i 
WHERE date_part('dow', '2014/04/01'::date + i) NOT IN (0,6)
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.