日付までの稼働日数が必要です。たとえば、01-01-2012と20-01-2012がある場合、T-SQL を使用してその 2 つの日付の間の稼働日数を取得したいと考えています。
15227 次
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 に答える