【问题标题】:SQL Query needed for desired Output所需输出所需的 SQL 查询
【发布时间】:2019-09-22 15:39:48
【问题描述】:

以下是从不同的 PLC 机器填充到 sql server 数据库的示例数据。日期时间、机器 ID、周期时间(生产该材料所用的时间)和班次

A 公司(早上 6:30 到下午 2:30)、B(2:30 到 10:30)、C(10:30 到 6:30)有 3 个班次。 当我进行 C Shift 计数时,我的查询也应该在早上 6:30 之前获取第二天的数据。其中 A 班应该从上午 6:30 到下午 2:30 获取当天数据。而 B 班应该从下午 2:31 到晚上 10:30 获取当天数据。

期望的输出::

我需要找出每个小时的数量...6:30 到 7:30 的数量是多少... 7:30 到 8:30 的数量是多少等等。数量不应与前一小时数量相加.. 单个小时数量

【问题讨论】:

  • 是否需要 6:30 到 7:30 或者我们可以将 6:00 到 7:00 的值相加等等?
  • 请分享你现有的sql。我还注意到 2:30/2:31 的结束/开始时间。这种模式是否也延伸到 10:30:00/10:30:01 和 6:30:00/6:30:01?还是 6:29:59/6:30:00 ??
  • 在 Desired Output 中,Hour 列是小时的开始还是结束?
  • 您应该以文本形式提供示例数据以获得更多答案。

标签: sql sql-server


【解决方案1】:

你可以从这个开始,然后用

包裹它
"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

我将任何剩余的问题留给您自己的解决方案

【讨论】:

  • 谢谢..它的工作。还有一个问题,如何始终从该查询中获取 Only Previous shift 和 current Shift 行
猜你喜欢
  • 2022-01-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-27
  • 1970-01-01
  • 2013-03-19
相关资源
最近更新 更多