你可以从这个开始,然后用
包裹它
"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
我将任何剩余的问题留给您自己的解决方案