This one will give you one row per day:
DECLARE @start dateTime = '20201021 14:45:00'
DECLARE @end dateTime = '20201023 19:15:00'
DECLARE @startDate Date = CAST(@start as date)
DECLARE @endDate Date = CAST(@end as date)
DECLARE @startTime Time = CAST(@start as time)
DECLARE @endTime Time = CAST(@end as time)
DECLARE @startOfDay DateTime = '08:00:00'
DECLARE @endOfDay DateTime = '16:00:00';
WITH lv0 AS (SELECT 0 g UNION ALL SELECT 0)
,lv1 AS (SELECT 0 g FROM lv0 a CROSS JOIN lv0 b) -- 4
,lv2 AS (SELECT 0 g FROM lv1 a CROSS JOIN lv1 b) -- 16
,lv3 AS (SELECT 0 g FROM lv2 a CROSS JOIN lv2 b) -- 256
,lv4 AS (SELECT 0 g FROM lv3 a CROSS JOIN lv3 b) -- 65,536
,lv5 AS (SELECT 0 g FROM lv4 a CROSS JOIN lv4 b) -- 4,294,967,296
,Tally (n) AS (SELECT ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) FROM lv5)
,
dates AS
(
SELECT
DateAdd(day,n-1,@startDate) as [Day]
FROM tally
WHERE n<=DATEDIFF(day,@startDate,@endDate)+1
)
select
[Day],
CASE WHEN [Day][email protected] THEN @start ELSE CAST([DAY] AS DateTime)[email protected] END as [startOfWork],
CASE WHEN [Day][email protected] THEN @end ELSE CAST([DAY] AS DateTime)[email protected] END as [endOfWork]
FROM dates
result:
| Day | startOfWork | endOfWork |
|------------|-------------------------|-------------------------|
| 2020-10-21 | 2020-10-21 14:45:00.000 | 2020-10-21 16:00:00.000 |
| 2020-10-22 | 2020-10-22 08:00:00.000 | 2020-10-22 16:00:00.000 |
| 2020-10-23 | 2020-10-23 08:00:00.000 | 2020-10-23 19:15:00.000 |
CLICK HERE to find out more related problems solutions.