时间戳使用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>
如果您只是想比较日期并查找彼此相距在一分钟以内的行,则不需要使用纪元时间。 .
上有几种解决此问题的方法
我很想知道在 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>
如果您只是想比较日期并查找彼此相距在一分钟以内的行,则不需要使用纪元时间。