Datetime SQL语句(在SQL Developer中工作)

时间:2018-06-14 07:20:20

标签: sql oracle datetime

我是SQL场景的新手,但在学习了一些关于SQL Developer之后,我开始收集一些对我有意义的数据。虽然,我确实需要查询帮助。

我的目标: 要使用当前标准,只有当日期时间值在最新日期时间的5分钟内时才选择记录。这是我当前的sql语句

`SELECT ABAMS.T_WORKORDER_HIST.LINE_NO AS Line,
  ABAMS.T_WORKORDER_HIST.STATE        AS State,
  ASMBLYTST.V_SEQ_SERIAL_ALL.BUILD_DATE,
  ASMBLYTST.V_SEQ_SERIAL_ALL.SEQ_NO,
  ASMBLYTST.V_SEQ_SERIAL_ALL.SEQ_NO_EXT,
  ASMBLYTST.V_SEQ_SERIAL_ALL.UPD_REASON_CODE,
  ABAMS.V_SERIAL_LINESET.LINESET_DATE            AS "Lineset Time",
  ABAMS.T_WORKORDER_HIST.SERIAL_NO               AS ESN,
  ABAMS.T_WORKORDER_HIST.ITEM_NO                 AS "Shop Order",
  ABAMS.T_WORKORDER_HIST.CUST_NAME               AS Customer,
  ABAMS.T_ITEM_POLICY.PL_LOC_DROP_ZONE_NO        AS PLDZ,
  ABAMS.T_WORKORDER_HIST.CONFIG_NO               AS Configuration,
  ASMBLYTST.V_EDP_ENG_LAST_ABSN.LAST_ASMBLY_ABSN AS "Last Sta",
  ASMBLYTST.V_LAST_ENG_LOCATION.LAST_ASMBLY_LOC,
  ASMBLYTST.V_LAST_ENG_LOCATION.LAST_MES_LOC,
  ASMBLYTST.V_LAST_ENG_LOCATION.LAST_ASMBLY_TIME,
  ASMBLYTST.V_LAST_ENG_LOCATION.LAST_MES_TIME
FROM ABAMS.T_WORKORDER_HIST
LEFT JOIN ABAMS.V_SERIAL_LINESET
ON ABAMS.V_SERIAL_LINESET.SERIAL_NO = ABAMS.T_WORKORDER_HIST.SERIAL_NO
LEFT JOIN ASMBLYTST.V_EDP_ENG_LAST_ABSN
ON ASMBLYTST.V_EDP_ENG_LAST_ABSN.SERIAL_NO = ABAMS.T_WORKORDER_HIST.SERIAL_NO
LEFT JOIN ASMBLYTST.V_SEQ_SERIAL_ALL
ON ASMBLYTST.V_SEQ_SERIAL_ALL.SERIAL_NO = ABAMS.T_WORKORDER_HIST.SERIAL_NO
LEFT JOIN ABAMS.T_ITEM_POLICY
ON ABAMS.T_ITEM_POLICY.ITEM_NO = ABAMS.T_WORKORDER_HIST.ITEM_NO
LEFT JOIN ABAMS.T_CUR_STATUS
ON ABAMS.T_CUR_STATUS.SERIAL_NO = ABAMS.T_WORKORDER_HIST.SERIAL_NO
INNER JOIN ASMBLYTST.V_LAST_ENG_LOCATION
ON ASMBLYTST.V_LAST_ENG_LOCATION.SERIAL_NO = ABAMS.T_WORKORDER_HIST.SERIAL_NO
WHERE ABAMS.T_WORKORDER_HIST.LINE_NO       = 10
AND (ABAMS.T_WORKORDER_HIST.STATE          = 'PROD'
OR ABAMS.T_WORKORDER_HIST.STATE            = 'SCHED')
AND ASMBLYTST.V_SEQ_SERIAL_ALL.BUILD_DATE BETWEEN TRUNC(SysDate) - 10 AND TRUNC(SysDate) + 1
AND (ABAMS.V_SERIAL_LINESET.LINESET_DATE           IS NOT NULL
OR ABAMS.V_SERIAL_LINESET.LINESET_DATE             IS NULL)
AND (ASMBLYTST.V_EDP_ENG_LAST_ABSN.LAST_ASMBLY_ABSN < '1800'
OR ASMBLYTST.V_EDP_ENG_LAST_ABSN.LAST_ASMBLY_ABSN  IS NULL)
ORDER BY ASMBLYTST.V_EDP_ENG_LAST_ABSN.LAST_ASMBLY_ABSN DESC Nulls Last,
  ABAMS.V_SERIAL_LINESET.LINESET_DATE Nulls Last,
  ASMBLYTST.V_SEQ_SERIAL_ALL.BUILD_DATE,
  ASMBLYTST.V_SEQ_SERIAL_ALL.SEQ_NO,
  ASMBLYTST.V_SEQ_SERIAL_ALL.SEQ_NO_EXT`

以下是我从表中获得的一些记录

ASMBLYTST.V_LAST_ENG_LOCATION.LAST_ASMBLY_TIME

2018-06-14 01:28:25
2018-06-14 01:29:26
2018-06-14 01:27:30
2018-06-13 22:44:03
2018-06-14 01:28:45
2018-06-14 01:27:37
2018-06-14 01:27:41

我真正想要的是

2018-06-13 22:44:03

要从查询中排除,因为它不在最新记录的5分钟窗口内,该数据集中的哪一个

2018-06-14 01:29:26

我似乎遇到的一个动态问题是日期时间的值不断更新。

有什么想法吗?

谢谢!

1 个答案:

答案 0 :(得分:0)

以下是两种不同的解决方案,每种解决方案都使用一个名为&#34; ASET&#34;的表。 ASET包含间隔1分钟的20条记录:

ArrayList

现在使用ASET作为我们的数据,以下查询在ASET中查找最大日期,并在ASET的5分钟内将结果限制为6条记录:

import subprocess

def check_output(command_list):
    proc = subprocess.Popen(command_list, stdout=subprocess.PIPE)
    proc.wait()
    return proc.stdout.read()

另一种方法是使用分析函数:

WITH
    aset (ttime, cnt)
    AS
        (SELECT systimestamp AS ttime, 1 AS cnt
           FROM DUAL
         UNION ALL
         SELECT ttime + INTERVAL '1' MINUTE AS ttime, cnt + 1 AS cnt
           FROM aset
          WHERE cnt < 20)
select * from aset;