Datetime values generation MS SQL

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.

Leave a Comment

Your email address will not be published.

Scroll to Top