在sql中查找彼此相隔毫秒的条目

时间:2019-05-03 16:27:05

标签: sql oracle

我需要调试一个在别人的代码中发现的问题,该问题会同时读取ID和密钥的时间戳。但是,我注意到它没有读取毫秒信息。虽然这是一个潜在原因,但尚未确认,我需要找出是否是原因。

如果表中的两个条目在同一秒内10:20:05.0500 pm和10:20:05.5000 pm发生,但不是10:20:05.5000和10:20:06.0500,则可能会发生此问题。

如何编写这样的查询来查找它?

我正在使用Oracle pl / sql。

2 个答案:

答案 0 :(得分:1)

在Oracle中,要使用小数秒,列的数据类型必须为“ TIMESTAMP ”。

也许其他人的代码正在使用类型为 DATE 的变量,该变量是年-月-日时分-秒,无小数秒。

Database SQL Language Reference: Data Types

您能提供表格说明和其他人的代码吗?

答案 1 :(得分:1)

要查找具有相同日期/时间(秒精度)但具有不同毫秒数的记录,可以通过将表自身连接起来来比较不同的记录

SELECT A.ts, B.ts
FROM
    Test A
    INNER JOIN Test B
        ON TO_CHAR(A.ts, 'YYYY-MM-DD HH24:MI:SS') = TO_CHAR(B.ts, 'YYYY-MM-DD HH24:MI:SS')
WHERE
    A.ts < B.ts
ORDER BY
    A.ts, B.ts;

TO_CHAR截断毫秒。这很重要,因为四舍五入的函数可能会产生不同的秒数。例如CAST(ts as timestamp(0))个回合,这不是我们所需要的。

下面链接中的示例记录了999毫秒来进行测试。

请参见example on SQL Fiddle