11

2 つの日付がある場合、次を使用して 2 つの日付の間に何日、何時間、何分などがあるかを計算できますdatediff

declare @start datetime;
set @start = '2013-06-14';

declare @end datetime;
set @end = '2013-06-15';

select datediff( hour, @start, @end );

日付範囲に週末が含まれているかどうかを確認するにはどうすればよいですか?

日付範囲に週末が含まれているかどうかを知りたいのは、日または時間のカウントから週末を減算したいからです。つまり、開始日が金曜日で終了日が月曜日の場合、取得できるのは 1 日または 24 時間だけです。

私のサーバーでは、Datepart 1 = 日曜日、datepart 7 = 土曜日です。

4

7 に答える 7

8

2 つの日付間の営業日を計算する関数があります。基本的なクエリは次のとおりです。

declare @start datetime;
set @start = '2013-06-14';

declare @end datetime;
set @end = '2013-06-17';
SELECT 
   (DATEDIFF(dd, @Start, @end) +1)  -- total number of days (inclusive)
  -(DATEDIFF(wk, @Start, @end) * 2) -- number of complete weekends in period
  -- remove partial weekend days, ie if starts on sunday or ends on saturday
  -(CASE WHEN DATENAME(dw, @Start) = 'Sunday' THEN 1 ELSE 0 END) 
  -(CASE WHEN DATENAME(dw, @end) = 'Saturday' THEN 1 ELSE 0 END) 

したがって、営業日がdatediff in daysと異なる場合、日付に週末が含まれているかどうかを判断できます

  SELECT case when  (DATEDIFF(dd, @Start, @end) +1) <>
   (DATEDIFF(dd, @Start, @end) +1)  -- total number of days (inclusive)
  -(DATEDIFF(wk, @Start, @end) * 2) -- number of complete weekends in period
  -- remove partial weekend days, ie if starts on sunday or ends on saturday
  -(CASE WHEN DATENAME(dw, @Start) = 'Sunday' THEN 1 ELSE 0 END) 
  -(CASE WHEN DATENAME(dw, @end) = 'Saturday' THEN 1 ELSE 0 END) then 'Yes' else 'No' end as IncludesWeekends

またはより簡単

SELECT   (DATEDIFF(wk, @Start, @end) * 2) +(CASE WHEN DATENAME(dw, @Start) = 'Sunday' THEN 1 ELSE 0 END)      +(CASE WHEN DATENAME(dw, @end) = 'Saturday' THEN 1 ELSE 0 END)  as weekendDays
于 2013-06-14T14:51:11.253 に答える
3

次の 3 つの条件のいずれかが true の場合、週末になります。

  1. 終了日の曜日 (整数) が開始日の曜日より前です

  2. どちらの日もそれ自体が週末の日

  3. 範囲には少なくとも 6 日が含まれます

.

select 
    Coalesce(
    --rule 1
    case when datepart(dw,@end) - datepart(dw,@start) < 0 then 'Weekend' else null end,
    -- rule 2
    -- depends on server rules for when the week starts
    -- I think this code uses sql server defaults
    case when datepart(dw,@end) in (1,7) or datepart(dw,@start) in (1,7) then 'Weekend' else null end,
    --rule 3
    -- six days is long enough
    case when datediff(d, @start, @end) >= 6 then 'Weekend' Else null end,
    -- default
    'Weekday')
于 2013-06-14T14:49:49.037 に答える
0

これは単純で一般化されたクエリです。再帰クエリを通じて結果を得ることができます。次のクエリを確認してください

with mycte as
(
  select cast('2013-06-14' as datetime) DateValue
  union all
  select DateValue + 1 from mycte where DateValue + 1 < '2013-06-17'
)

select count(*) as days , count(*)*24 as hours
from    mycte
WHERE DATENAME(weekday ,DateValue) != 'SATURDAY' AND 
DATENAME(weekday ,DateValue) != 'SUNDAY'
OPTION (MAXRECURSION 0)

それは間違いなくあなたのために働くでしょう。

于 2013-06-14T15:16:23.033 に答える
0

再帰CTEを使用して、範囲間の日付を取得できます

     WITH    CTE_DatesTable
          AS ( SELECT   @MinDate AS [EffectiveDate]
               UNION ALL
               SELECT   DATEADD(dd, 1, [EffectiveDate])
               FROM     CTE_DatesTable
               WHERE    DATEADD(dd, 1, [EffectiveDate]) <= @MaxDate )

            SELECT  [EffectiveDate]
            FROM    CTE_DatesTable
    OPTION  ( MAXRECURSION 0 );

.. を使用して週末を除外します。

((DATEPART(dw, DT.EffectiveDate) + @@DATEFIRST) % 7) NOT IN (0, 1) 
于 2013-06-14T15:34:36.767 に答える