SQL-запрос необходим для желаемого вывода - PullRequest
0 голосов
/ 22 сентября 2019

Ниже приведен пример данных, которые заполняются в базе данных сервера SQL с другого компьютера ПЛК.datetime, machineID, цикл (время, необходимое для производства этого материала) и сдвиг

enter image description here

В компании A есть 3 смены (с 6:30 до 2:30:00), B (с 2:30 до 10:30), C (с 10:30 до 6:30).когда я беру C Shift count, мой запрос должен принимать данные следующего дня также до 6:30 утра.Где в качестве смены должны приниматься данные текущего дня, начиная с 6:30 до 02:30. Где в смене В должны приниматься данные текущего дня, начиная с 14:31 до 22:30.

Желаемый результат ::

enter image description here

Мне нужно найти количество для каждого часа ... с 6:30 до 7:30, что такое количество ... с 7:30 до 8: 30 каково количество и так далее для каждого отдельного часа.Количество не должно добавляться к количеству предыдущего часа .. количество отдельных часов

1 Ответ

1 голос
/ 22 сентября 2019

Вы можете начать с этого, а затем обернуть его

"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

Я оставляю любые оставшиеся вопросы на ваше собственное решение

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...