如何在 Toad for Oracle 中通过 SQL 过滤时间戳差异?

问题描述 投票:0回答:1

在我的表格中,有两列:

  • LAST_CHANGED_DATE
  • LOG_ENTRY_TIMESTAMP

两者的数据类型均列为

TIMESTAMP(6) WITH TIMEZONE
。 两列的条目均采用以下格式:
05/03/2019 09:37:35.849116 +00:00
(对于夏令时,
+00:00
更改为
+01:00

通常,当使用

<
>
等命令时,我必须按如下所示格式化时间戳:
TO_TIMESTAMP_TZ('14/11/2021 20:32:07.165000 +01:00', 'DD/MM/YYYY HH24:MI:SS.FF TZH:TZM')

该表包含如下条目:

EXCEPT_ID LAST_CHANGED_DATE LOG_ENTRY_TIMESTAMP
COM_000001 2019/05/03 09:37:35.849116 +00:00 2019/05/03 09:37:35.849116 +00:00
DEV_000003 2019/03/12 17:13:54.187714 +00:00 2019/03/12 17:13:54.187714 +00:00
DEV_000007 2019/08/04 11:38:04.267723 +00:00 2019/08/04 11:38:04.267723 +00:00
COM_002913 28/09/2022 22:00:26.654732 +01:00 2022年9月28日22:00:26.655739 +01:00

通常,对于任何条目,列

LAST_CHANGED_DATE
LOG_ENTRY_TIMESTAMP
之间没有区别。然而,偶尔也会有;如上表中的
EXCEPT_ID
-
COM_002913
所示。

有没有办法让我从该表中提取所有条目,其中 LAST_CHANGED_DATE 和 LOG_ENTRY_TIMESTAMP 列之间的差异不为“0”?(如果我们假装上面的示例表是完整的数据集,答案将是

COM_002913
)。

我编写了以下查询,它为我提供了所有条目的时间戳之间的差异:

SELECT EXCEPT_ID, LAST_CHANGED_DATE - LOG_ENTRY_TIMESTAMP AS Difference

FROM table_name

但这给了我超过 14, 000 个条目。 (

COM_002913
的差异表示为
-00 00:00:00.001007
)

我尝试添加

WHERE
子句 (
WHERE DIFFERENCE <> '0'
),但收到以下错误:

ORA-06553:PLS-306:调用“OGC_DIFFERENCE”时的数字、类型或参数错误。

sql
1个回答
1
投票

您可以检查时间戳是否不相等:

SELECT EXCEPT_ID,
       LAST_CHANGED_DATE - LOG_ENTRY_TIMESTAMP AS difference
FROM   POMSUSERPRD.CO_EXCEPT_META_ST_LG
WHERE  LAST_CHANGED_DATE != LOG_ENTRY_TIMESTAMP

对于样本数据:

CREATE TABLE CO_EXCEPT_META_ST_LG (EXCEPT_ID, LAST_CHANGED_DATE, LOG_ENTRY_TIMESTAMP) AS
SELECT 'COM_000001', TIMESTAMP '2019-03-05 09:37:35.849116 +00:00', TIMESTAMP '2019-03-05 09:37:35.849116 +00:00' FROM DUAL UNION ALL
SELECT 'DEV_000003', TIMESTAMP '2019-03-12 17:13:54.187714 +00:00', TIMESTAMP '2019-03-12 17:13:54.187714 +00:00' FROM DUAL UNION ALL
SELECT 'DEV_000007', TIMESTAMP '2019-04-08 11:38:04.267723 +00:00', TIMESTAMP '2019-04-08 11:38:04.267723 +00:00' FROM DUAL UNION ALL
SELECT 'COM_002913', TIMESTAMP '2022-09-28 22:00:26.654732 +01:00', TIMESTAMP '2022-09-28 22:00:26.655739 +01:00' FROM DUAL UNION ALL
SELECT 'DEV_000008', TIMESTAMP '2019-04-08 11:38:04.267723 +00:00', TIMESTAMP '2019-04-08 12:38:04.267723 +01:00' FROM DUAL;

注意:最后一行是一个示例,其中各列具有相同的 UTC 时间,但位于不同的时区,因此即使时间相同,看起来也不同。

输出:

EXCEPT_ID 差异
COM_002913 -000000000 00:00:00.001007000

小提琴

© www.soinside.com 2019 - 2024. All rights reserved.