ひとつのアイデアは、@ d2の前に@ d1と前月曜日以降に最初の月曜日を(私たちは「週末」は土日を意味することを言っている場合)を見つけることです。これは一週間の数です。だから一週間の時間は120(5日* 24時間)です。それから、最後の月曜日から@ d2までの時間を追加します。 @ d2の曜日の単純なケースでは、この先週の週末を世話することができます。同様に、@ d1と最初の月曜日の間の時間を数えます。
declare @d1 datetime, @d2 datetime
select @d1 = '2017-08-10 19:51:01.000', @d2 = '2017-08-16 17:52:14.000'
declare @StartOfFirstWeekAfterStartDate date = cast(dateadd(day, case datepart(weekday, @d1)
when 1 /* Sunday */ then -6
when 2 /* Monday */ then 0
when 3 /* Tuesday */ then 6
when 4 /* Wendsday */ then 5
when 5 /* Thursday */ then 4
when 6 /* Friday */ then 3
when 7 /* Saturday */ then 2
end, @d1) as date),
@StartOfLastWeekBeforeEndDate date = cast(dateadd(day, case datepart(weekday, @d2)
when 1 /* Sunday */ then -6
when 2 /* Monday */ then 0
when 3 /* Tuesday */ then -1
when 4 /* Wendsday */ then -2
when 5 /* Thursday */ then -3
when 6 /* Friday */ then -4
when 7 /* Saturday */ then -5
end, @d2) as date)
declare @NumberOfWorkdays int = datediff(week, @StartOfFirstWeekAfterStartDate, @StartOfLastWeekBeforeEndDate) * 5
declare @HoursWeekBefore int = case datepart(weekday, @d1)
when 1 /* Sunday */ then 0
when 2 /* Monday */ then 5 * 24 - datepart(hour, @d1)
when 3 /* Tuesday */ then 4 * 24 - datepart(hour, @d1)
when 4 /* Wendsday */ then 3 * 24 - datepart(hour, @d1)
when 5 /* Thursday */ then 2 * 24 - datepart(hour, @d1)
when 6 /* Friday */ then 1 * 24 - datepart(hour, @d1)
when 7 /* Saturday */ then 0
end
declare @HoursWeekAfter int = case datepart(weekday, @d2)
when 1 /* Sunday */ then 5 * 24
when 2 /* Monday */ then 0 * 24 + datepart(hour, @d2)
when 3 /* Tuesday */ then 1 * 24 + datepart(hour, @d2)
when 4 /* Wendsday */ then 2 * 24 + datepart(hour, @d2)
when 5 /* Thursday */ then 3 * 24 + datepart(hour, @d2)
when 6 /* Friday */ then 4 * 24 + datepart(hour, @d2)
when 7 /* Saturday */ then 5 * 24
end
declare @HoursDiff int = @HoursWeekBefore + @NumberOfWorkdays * 24 + @HoursWeekAfter
select
@StartOfFirstWeekAfterStartDate,
datepart(WEEKDAY, @StartOfFirstWeekAfterStartDate), -- Should always be Monday
@StartOfLastWeekBeforeEndDate,
datepart(WEEKDAY, @StartOfLastWeekBeforeEndDate), -- Should always be Monday
@NumberOfWorkdays,
datediff(week, @StartOfFirstWeekAfterStartDate, @StartOfLastWeekBeforeEndDate),
@HoursWeekBefore,
@HoursWeekAfter,
@HoursDiff
上記のコードは、sp/udfの使用に適しています。
declare @d1 datetime, @d2 datetime
select @d1 = '2017-08-10 19:51:01.000', @d2 = '2017-08-16 17:52:14.000'
select case datepart(weekday, @d1)
when 1 /* Sunday */ then 0
when 2 /* Monday */ then 5 * 24 - datepart(hour, @d1)
when 3 /* Tuesday */ then 4 * 24 - datepart(hour, @d1)
when 4 /* Wendsday */ then 3 * 24 - datepart(hour, @d1)
when 5 /* Thursday */ then 2 * 24 - datepart(hour, @d1)
when 6 /* Friday */ then 1 * 24 - datepart(hour, @d1)
when 7 /* Saturday */ then 0
end /* @HoursWeekBefore */
+
datediff(week,
cast(dateadd(day, case datepart(weekday, @d1)
when 1 /* Sunday */ then -6
when 2 /* Monday */ then 0
when 3 /* Tuesday */ then 6
when 4 /* Wendsday */ then 5
when 5 /* Thursday */ then 4
when 6 /* Friday */ then 3
when 7 /* Saturday */ then 2
end, @d1) as date) /* @StartOfFirstWeekAfterStartDate */,
cast(dateadd(day, case datepart(weekday, @d2)
when 1 /* Sunday */ then -6
when 2 /* Monday */ then 0
when 3 /* Tuesday */ then -1
when 4 /* Wendsday */ then -2
when 5 /* Thursday */ then -3
when 6 /* Friday */ then -4
when 7 /* Saturday */ then -5
end, @d2) as date) /* @StartOfLastWeekBeforeEndDate */) * 5 /* @NumberOfWorkdays */ * 24
+
case datepart(weekday, @d2)
when 1 /* Sunday */ then 5 * 24
when 2 /* Monday */ then 0 * 24 + datepart(hour, @d2)
when 3 /* Tuesday */ then 1 * 24 + datepart(hour, @d2)
when 4 /* Wendsday */ then 2 * 24 + datepart(hour, @d2)
when 5 /* Thursday */ then 3 * 24 + datepart(hour, @d2)
when 6 /* Friday */ then 4 * 24 + datepart(hour, @d2)
when 7 /* Saturday */ then 5 * 24
end /* @HoursWeekAfter */
、上記の計算は、DATEFIRST設定に依存しませてくださいということ:我々は、単一の式にすべてのこれらの計算を置く場合は、このなります。私は、日曜日が週の最初の曜日であるという前提で書いています(すなわち、datepart(平日、@Moday)は2を返します)。そうでない場合は、case文のオフセットを調整する必要があります。 また、私はこれらの時間に分を処理しなかったので、時間計算は少し粗いです。これが問題である場合は、@ d1の間とd2 @分の数を計算し、これは、私は機能(に類似)で60
「週末」とは、実際に「休業日」を意味しましたか?それらは同じものではないからです。そして、自然災害が報道されているので、「標準的な」就業日であっても実際には「働いていない」と考えてください。これをどうやって解決しますか?インターネットで「カレンダーテーブル」を検索します。 – SMor