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

mm5n2pyu  于 2023-06-29  发布在  Oracle
关注(0)|答案(1)|浏览(109)

我有一个名为CO_EXCEPT_META_ST_LG的表,它位于一个名为POMSUSERPRD的模式下。
在此表中,有两列:

  • 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')
该表具有如下条目:
| 最后更改日期|日志_录入_时间戳| LOG_ENTRY_TIMESTAMP |
| - -----|- -----| ------------ |
| 2019 - 05 - 03 09:37:35.849116 +00:00| 2019 - 05 - 03 09:37:35.849116 +00:00| 05/03/2019 09:37:35.849116 +00:00 |
| 12/03/2019 17:13:54.187714 +00:00| 12/03/2019 17:13:54.187714 +00:00| 12/03/2019 17:13:54.187714 +00:00 |
| 2019 - 08 - 04 11:38:04.267723 +00:00| 2019 - 08 - 04 11:38:04.267723 +00:00| 08/04/2019 11:38:04.267723 +00:00 |
| 2022年9月28日22:00:26.654732 +01:00| 2022年9月28日22:00:26.655739 +01:00| 28/09/2022 22:00:26.655739 +01:00 |
通常,对于任何条目,列LAST_CHANGED_DATELOG_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 POMSUSERPRD.CO_EXCEPT_META_ST_LG
但这给了我超过14000个条目。(COM_002913的差值表示为-00 00:00:00.001007
我尝试添加WHERE子句(WHERE DIFFERENCE <> '0'),但收到以下错误:
ORA-06553:PLS-306:对“OGC_DIFFERENCE”的调用中的数字、类型或参数错误。

ds97pgxw

ds97pgxw1#

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

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时间,但处于不同的时区,因此即使它们是相同的时间,也会显示为不同。

输出:
| 差异| DIFFERENCE |
| - -----| ------------ |
| 000000000 00:00:00.001007000| -000000000 00:00:00.001007000 |
fiddle

相关问题