【问题标题】:Select record between specific range在特定范围之间选择记录
【发布时间】:2021-12-06 15:29:56
【问题描述】:

我目前在SQL中有一个很长的记录列表,由开始和结束分隔,中间我有重复值与加工名称。 如何检索具有开始和结束日期以及关联名称的所有进程? 我的实际查询是

    SELECT TOP 1000 id_prod,Descrizione,Parm0,LEFT(parm1, LEN(parm1)-20) as Azione ,convert(DateTime,right(parm1,19)) as Orario FROM INPUT
    where
        Parm0 = 'programstate' and (charindex('DNC_PRG_STS_FINISHED', Parm1) > 0)
             or
         Parm0 = 'programevent' and (charindex('dnc_prg_evt_started', Parm1) > 0 )
          or
          (
              parm0='ProgramName' and (charindex('USB0', Parm1) > 0)
                  )
    order by Orario Desc
id_prod Parm0 Azione Orario
2755686 ProgramName \USB0\P99\PIASTRA M8.H 2021-12-06 11:46:48.000
2755683 ProgramName \USB0\P99\PIASTRA M8.H 2021-12-06 11:46:38.000
2755681 ProgramName \USB0\P99\PIASTRA M8.H 2021-12-06 11:46:37.000
2755676 ProgramName \USB0\P99\PIASTRA M8.H 2021-12-06 11:46:36.000
2755672 ProgramName \USB0\P99\PIASTRA M8.H 2021-12-06 11:46:33.000
2755666 ProgramState DNC_PRG_STS_FINISHED 2021-12-06 11:42:33.000
2755663 ProgramName \USB0\P99\PIASTRA M8.H 2021-12-06 11:42:23.000
2755662 ProgramName \USB0\P99\PIASTRA M8.H 2021-12-06 11:42:22.000
2755659 ProgramName \USB0\P99\PIASTRA M8.H 2021-12-06 11:42:21.000
2755644 ProgramState DNC_PRG_EVT_STARTED 2021-12-06 11:22:33.000
2755641 ProgramName \USB0\P99\PIASTRA M8.H 2021-12-06 11:22:33.000
2755633 ProgramName \USB0\P99\PIASTRA M8.H 2021-12-06 11:22:13.000
2755631 ProgramName \USB0\P99\PIASTRA M8.H 2021-12-06 11:21:23.000

编辑: 谢谢@LukStorms,但这不是我需要的。开始、代码和结束组有数千个。我希望我最后有这样的清单

id_prod Start Finish Lavorazione
1 2021-12-06 11:22:33.000 2021-12-06 11:42:33.000 \USB0\P99\PIASTRA M8.H
2 2021-12-06 11:11:43.000 2021-12-06 11:12:33.000 \USB0\P99\Lavorazione 11.H
3 2021-12-06 09:11:43.000 2021-12-06 11:42:33.000 \USB0\P99\Produzione 322.H
4 2021-12-02 11:11:43.000 2021-12-20 12:12:12.000 \USB0\P11\Piastra 19.H

我希望我很清楚。有成千上万个这样的过程,我需要把开头、结尾和中间的内容都放在中间,以便能够用表格使其可读

【问题讨论】:

  • 是样本数据还是预期结果?无论如何我们都需要。
  • 您使用的是哪个 dbms? (MS SQL Server?)
  • 这是一小部分真实数据。我使用 MS SQL Server

标签: sql subquery


【解决方案1】:

您可以通过PATINDEX定位时间戳的位置。

示例 sn-p

declare @input table (
 id_prod int, 
 parm0 varchar(100),
 parm1 varchar(100)
);

insert into @input (id_prod, parm0, parm1) values
  (2755686, 'ProgramName',  '\USB0\P99\PIASTRA M8.H2021-12-06 11:46:48') 
, (2755644, 'ProgramEvent', 'DNC_PRG_EVT_STARTED 2021-12-06 11:22:33') 
, (2755666, 'ProgramState', 'DNC_PRG_STS_FINISHED 2021-12-06 11:42:33') 

SELECT *
FROM
(
    SELECT id_prod, parm0
    , LEFT(parm1, PATINDEX('%_20[0-9][0-9]-%', parm1)) AS Azione
    , TRY_CAST(SUBSTRING(parm1, PATINDEX('%20[0-9][0-9]-%', parm1), 19) AS DATETIME) AS Orario
    FROM @input
    WHERE parm0 IN ('programname', 'programevent', 'programstate')
      AND parm1 LIKE '%2021-12%'
) q
WHERE Orario BETWEEN '2021-12-01 00:00:00' AND '2021-12-06 23:59:59' 
id_prod parm0 Azione Orario
2755686 ProgramName \USB0\P99\PIASTRA M8.H 2021-12-06 11:46:48.000
2755644 ProgramEvent DNC_PRG_EVT_STARTED 2021-12-06 11:22:33.000
2755666 ProgramState DNC_PRG_STS_FINISHED 2021-12-06 11:42:33.000

db小提琴here

【讨论】:

    猜你喜欢
    • 2017-02-03
    • 1970-01-01
    • 2013-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多