Вы можете начать с этого, а затем обернуть его
"SELECT ... just the columns you want
FROM this example
GROUP BY ...."
SELECT
-- isolate Date from Time from HourMinutes only for testing
CONVERT(VARCHAR(10), [MDate], 111) as RealDate
,CONVERT(VARCHAR, [MTime], 108) as RealTime
,SUBSTRING(CONVERT(VARCHAR, [MTime], 108),4,5) as HrMn
-- from midnight to 6:30 adjust to prior day
, Case When (CONVERT(VARCHAR, [MTime], 108) < '06:30:00')
Then CONVERT(VARCHAR(10), DATEADD(day,-1,[MDate]), 111)
Else CONVERT(VARCHAR(10), [MDate], 111)
End as RptDate
-- from after the half hour, report it with the next hour
,Case When (SUBSTRING(CONVERT(VARCHAR, [MTime], 108),1,5)) > '23:30:00'
Then ' 0:30'
When (SUBSTRING(CONVERT(VARCHAR, [MTime], 108),4,5)) > '30:00'
Then STR(DATEPART ( hour , [MTime] ) + 1, 2) + ':30'
Else STR(DATEPART ( hour , [MTime] ), 2) + ':30'
End as RptHour
,[MachinelD]
,[CYCLETIM]
,[Shift]
FROM [StackOver].[dbo].[CShift]
. Для вашего дополнительного вопроса о получении только предыдущей или текущей смены нам нужно заранее продумать, как может выглядеть предложение Where.-
Where (MDate = @fromDate and MTime >= @fromTime)
Or (MDate > @fromDate)
А затем, перед основным SELECT / FROM, создать соответствующие локальные переменные -
Declare @fromDate as datetime, @fromTime as datetime
If CONVERT (time, GETDATE()) <= '06:30:00' Begin
Set @fromDate=DATEADD(day,-1,CONVERT (date, GETDATE())) --yesterday
Set @fromTime='14:30'
End
Else If CONVERT (time, GETDATE()) <= '14:30:00' Begin
Set @fromDate=DATEADD(day,-1,CONVERT (date, GETDATE())) --yesterday
Set @fromTime='22:30'
End
Else If CONVERT (time, GETDATE()) <= '22:30:00' Begin
Set @fromDate=CONVERT (date, GETDATE()) --today
Set @fromTime='06:30'
End
Else Begin -- time > 22:30
Set @fromDate=CONVERT (date, GETDATE()) --today
Set @fromTime='14:30'
End
-- for testing only, show the values
Select @fromDate, @fromTime
Я оставляю любые оставшиеся вопросы на ваше собственное решение