そのため、すべてのエッジ ケースを処理するには、いくつかの CASE ステートメントをうまく処理できる必要があります。これが私がまとめた例です。Numbers テーブルは単なる集計テーブルで、この場合は 1 から 30 までです。
CREATE TABLE #times (id INT IDENTITY(1,1), start_stamp DATETIME, end_stamp DATETIME)
INSERT INTO #times
(
start_stamp ,
end_stamp
)
SELECT DATEADD(DAY, -2*Number, CURRENT_TIMESTAMP), DATEADD(DAY, -1*Number, CURRENT_TIMESTAMP)
FROM Common.NUMBERS
WHERE Number < 31
SELECT id, start_stamp, end_stamp,
CASE WHEN DATEDIFF(DAY, start_stamp, end_stamp) < 7 THEN
CASE WHEN DATEPART(weekday, start_stamp) < DATEPART(weekday, end_stamp)
THEN DATEDIFF(MINUTE, start_stamp, DATEADD(HOUR, -48, end_stamp))
ELSE DATEDIFF(MINUTE, start_stamp, end_stamp) END
ELSE DATEDIFF(MINUTE, start_stamp, DATEADD(HOUR, -48*(DATEDIFF(WEEK, start_stamp, end_stamp)), end_stamp)) END
+ CASE WHEN DATENAME(weekday,start_stamp) IN ('Sunday', 'Saturday') THEN 1440 ELSE 0 END
+ CASE WHEN DATENAME(weekday,end_stamp) IN ('Sunday', 'Saturday') THEN 1440 ELSE 0 END
FROM #times
もっと洗練された方法があるかもしれませんが、コードを使用すると、結果セット全体に対して実行し、行ごとに計算できます。