时间戳使用EPOCH时间获取1分钟以内的记录

Use EPOCH time for timestamp to get records within 1 minute

我很想知道在 Oracle 12c 中您如何采用时间戳数据类型并将记录转换为 EPOCH 时间以使其成为数字,然后使用该数字在该日期列中查找 1 分钟内的任何记录彼此(如果需要,假设同一天,或者只是 1 分钟内的任何计算)。

我尝试了以下但得到了一个 ORA-01873: leading precision of the interval is too small 错误。

select (sold_date - to_date('1970-01-01 00:00:00','YYYY-MM-DD HH24:MI:SS'))*86400 作为纪元_sold_date 来自测试 1;

什么是SOLD_DATE?例如SYSDATE(returns DATE 数据类型的函数),您的代码工作正常。

SQL> select (sysdate
  2          - to_date('1970-01-01 00:00:00','YYYY-MM-DD HH24:MI:SS')
  3         ) * 86400 as epoch_sold_date
  4  from dual;

EPOCH_SOLD_DATE
---------------
     1600807918

SQL>

由于 SOLD_DATE 是一个时间戳,但是 - 您似乎对几分之一秒没有兴趣或特别感兴趣,将其转换为 DATE:

select (cast (systimestamp as date)                                --> this
        - to_date('1970-01-01 00:00:00','YYYY-MM-DD HH24:MI:SS')
       ) * 86400 as epoch_sold_date 
from dual;

说你对所有行得到相同的结果:好吧,我没有,如果 SOLD_DATE 不同,你也不应该。

SQL> with test (sold_date) as
  2    (select timestamp '2020-09-22 00:00:00.000000' from dual union all
  3     select timestamp '2015-03-18 00:00:00.000000' from dual
  4    )
  5  select sold_date,
  6         (cast (sold_date as date)
  7          - to_date('1970-01-01 00:00:00','YYYY-MM-DD HH24:MI:SS')
  8         ) * 86400 as epoch_sold_date
  9  from test;

SOLD_DATE                      EPOCH_SOLD_DATE
------------------------------ ---------------
22.09.20 00:00:00,000000000         1600732800
18.03.15 00:00:00,000000000         1426636800

SQL>

再编辑一下:当您减去两个时间戳时,结果是 interval day to second。如果你从中提取分钟,你会得到你想要的:

SQL> with test (sold_date) as
  2    (select timestamp '2020-09-22 10:15:00.000000' from dual union all
  3     select timestamp '2015-03-18 08:05:00.000000' from dual
  4    )
  5  select sold_date,
  6         lead(sold_date) over (order by sold_date) next_sold_date,
  7         --
  8         lead(sold_date) over (order by sold_date) - sold_date diff,
  9         --
 10         extract(day from lead(sold_date) over (order by sold_date) - sold_date) diff_mins
 11  from test
 12  order by sold_date;

SOLD_DATE                      NEXT_SOLD_DATE                 DIFF                            DIFF_MINS
------------------------------ ------------------------------ ------------------------------ ----------
18.03.15 08:05:00,000000000    22.09.20 10:15:00,000000000    +000002015 02:10:00.000000000        2015
22.09.20 10:15:00,000000000

SQL>

在您的情况下,您将检查提取的 分钟 值是否大于 1(分钟)。


如果你只是想看看两个时间戳之间有多少分钟,那么

  • 将它们转换为日期
  • 减去这些日期(你会得到天数)
  • 乘以 24(一天有 24 小时)再乘以 60(一小时有 60 分钟)

像这样:

SQL> with test (date_1, date_2) as
  2    (select timestamp '2020-09-22 10:15:00.000000',
  3            timestamp '2020-09-22 08:05:00.000000' from dual
  4    )
  5  select (cast(date_1 as date) - cast(date_2 as date)) * 24 * 60 diff_minutes
  6  from test;

DIFF_MINUTES
------------
         130

SQL>

如果您只是想比较日期并查找彼此相距在一分钟以内的行,则不需要使用纪元时间。 .

上有几种解决此问题的方法