关于oracle:使用EPOCH时间做时间戳获取1分钟内的记录

 2022-01-08 

Use EPOCH time for timestamp to get records within 1 minute

我很想知道如何在 Oracle 12c 中获取时间戳数据类型并将记录转换为 EPOCH 时间以使它们成为数字,然后使用该数字在该日期列中查找每个记录 1 分钟内的任何记录其他(如果需要,假设在同一天,或者简单地在 1 分钟内进行任何计算)。

我尝试了以下但得到一个ORA-01873:间隔的前导精度太小错误。

选择 (sold_date - to_date(\\'1970-01-01 00:00:00\\',\\'YYYY-MM-DD HH24:MI:SS\\'))*86400 as epoch_sold_date from test1;


如果您只是想比较日期并查找相距一分钟以内的行,则不需要使用纪元时间。这个问题有几个解决方案。


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

1
2
3
4
5
6
7
8
9
10
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:

1
2
3
4
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 不同,你也不应该。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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。如果你从中提取分钟,你会得到你想要的:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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 分钟)

像这样:

1
2
3
4
5
6
7
8
9
10
11
12
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>