2

日付までの稼働日数が必要です。たとえば、01-01-201220-01-2012がある場合、T-SQL を使用してその 2 つの日付の間の稼働日数を取得したいと考えています。

4

4 に答える 4

7

SQL Server は会社が何を稼働日と見なしているかを認識していないため、この問題に対する最善の答えは、カレンダー テーブルを使用することです。過去と未来の日付を含むテーブルがあり、IsWorkDay適切に更新されたような列があれば、クエリは簡単です。

SELECT [Date] FROM dbo.Calendar 
  WHERE [Date] >= @start 
  AND [Date] <= @end
  AND IsWorkDay = 1;
于 2012-06-18T11:42:15.610 に答える
3
DECLARE @fromDate datetime, @toDate datetime 
SELECT @fromDate = ' 01-01-2012', @toDate = '20-01-2012'

SELECT (DATEDIFF(day, @fromDate, @toDate) + 1) 
        - (DATEDIFF(week, @fromDate, @toDate) * 2)  
        - (CASE WHEN DATENAME(weekday, @fromDate) = 'Sunday' THEN 1 ELSE 0 END) 
        - (CASE WHEN DATENAME(weekday, @toDate) = 'Saturday' THEN 1 ELSE 0 END)
于 2012-06-18T11:56:51.067 に答える
1

Aaron Bertrand の提案が気に入ったので、クエリに追加できるこのコードを書きました。CalendarDate 列で結合することにより、クエリで使用できる 2 つの日付の間にテーブル変数が作成されます (結合する前に、時間情報を削除することを忘れないでください)。これは、月曜日から金曜日までの典型的なアメリカの週に基づいています。

DECLARE @StartDate DATE
DECLARE @EndDate DATE

SET @StartDate = '2013-08-19'
SET @EndDate = '2013-08-26'

DECLARE @BusinessDay TABLE
(
    CalendarDate DATETIME,
    IsBusinessDay INT
)

DECLARE @Counter DATETIME = @StartDate
WHILE(@Counter <= @EndDate)
BEGIN
    INSERT INTO @WorkDays
    SELECT @Counter, CASE WHEN DATENAME(WEEKDAY, @Counter) NOT IN ('Saturday', 'Sunday') THEN 1 ELSE 0 END
    SET @Counter = DATEADD(DAY, 1, @Counter)
END

SELECT * FROM @BusinessDay

欠点は、必要なクエリごとにこれを再作成する必要があることです。そのため、これを頻繁に行う場合は、固定テーブルの方が適している可能性があります。

こんな風に使える……。

SELECT 
     BusinessDays = SUM(IsBusinessDay)
FROM
     @BusinessDay
WHERE
     CalendarDate BETWEEN @StartDate AND @EndDate

これにより、2 つの日付間の営業日数が表示されます。他の多くの人が言っているように、これは明らかに休日や私の誕生日を考慮していません.

于 2013-08-20T19:56:59.837 に答える
0

前のコードに基づいて、最終日を除外するように調整しました (尋ねられませんでしたが、必要でした)。

    select (DATEDIFF(dd,@fromDate, @toDate))    
- (DATEDIFF(ww,@fromDate, DATEADD(dd,-1,@toDate)) * 2) 
- (CASE WHEN DATENAME(dw, @fromDate) = 'Sunday' THEN 1 else 0 end)
- (CASE WHEN DATENAME(dw, @toDate) = 'Sunday' THEN 1 else 0 end)

これらの日付を含むテーブルを使用して、休日を削除しました

   - ( select count(distinct dcsdte) 
    from calendar_table 
    where dcsdte between @fromDate 
        and @toDate )
于 2015-11-16T17:10:22.193 に答える