【问题标题】:Datetime SQL statement (Working in SQL Developer)日期时间 SQL 语句(在 SQL Developer 中工作)
【发布时间】:2018-06-14 07:20:20
【问题描述】:

我是 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

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

有什么想法吗?

谢谢!

【问题讨论】:

  • 看看stackoverflow.com/help/mcve。 (让帮助你变得容易!)
  • 请删除该 SQL 中所有不相关的部分,并将其集中到一个中肯的 minimal reproducible example,这甚至可以帮助您找出问题所在。控制问题,您所说的日期时间值,这些是 实际 DateTime 类型,而不是 varchar 什么的,解释为DateTime?我问是因为当人们经常遇到DateTime 值的问题时,这是因为他们将它们存储为字符串并且不知道如何正确处理这个问题。您似乎没有这个问题,但我想我会问同样的问题。
  • 感谢您如此迅速地回复。到目前为止,我感谢您的帮助。我对此很陌生,因为我可能有一些非常基本的问题。
  • 我读取的这些值的数据类型是“日期”
  • 另外,我添加了整个语句,以防我可能启动了 sql 错误。我为糟糕的礼节道歉。但我会学得很快

标签: sql oracle datetime


【解决方案1】:

这里有两个不同的解决方案,每个都使用一个名为“ASET”的表。 ASET 包含 20 条记录,间隔 1 分钟:

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;

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

SELECT *
  FROM aset
 WHERE ttime >=   (SELECT MAX (ttime)
                    FROM aset)
               - INTERVAL '5' MINUTE;

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

 with  bset
    AS
        (SELECT ttime, cnt, MAX (ttime) OVER () - ttime AS delta
           FROM aset)
SELECT *
  FROM bset
 WHERE delta <= INTERVAL '5' MINUTE

【讨论】:

    猜你喜欢
    • 2013-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-07
    • 2011-11-21
    • 2022-01-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多