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;
如果您只是想比较日期并查找相距一分钟以内的行,则不需要使用纪元时间。这个问题有几个解决方案。
什么是
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> |
由于
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; |
说你得到所有行的相同结果:好吧,我没有,如果
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> |
再修改:减去两个时间戳,结果为
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> |
在您的情况下,您将检查提取的分钟值是否大于
如果你只是想看看两个时间戳之间有多少分钟,那么
- 把它们扔到日期
- 减去那些日期(你会得到天数)
- 乘以 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> |