oracle查出近30天,sql oracle语法如何查询大于30天的出去和未出去的记录,如图!...

这篇博客解答了如何使用Oracle SQL查询超过30天的出入记录问题。作者讨论了当存在多次出入记录时的计算方法,并提供了查询时间差的SQL示例,同时强调了在处理多次出入情况时的复杂性,建议使用窗口函数和存储过程来解决复杂场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

满意答案

00e27ab806e4881f8254fe7ae8741834.png

nfswi

2019.04.11

00e27ab806e4881f8254fe7ae8741834.png

采纳率:57%    等级:7

已帮助:113人

现在这个表看起来正常,那么有一个疑问,如果出现多次出入那怎么计算?比如有一个车牌,有两次入,两次出,这是有可能的,那么怎么计算?算累计,某一次,还是最近一次?

如果只有一次出入,也就是说出或入,或者二者都只有一次,那就比较容易了,只要找到二者都有,或者有入无出的就行。我假设时间为date字段,如果不是,请自行转换格式。

select b.车辆号码,nvl(a.时间,sysdate)-b.时间 时间差 from (select 车辆号码,时间 from table where 出入='出') a right join (select 车辆号码,时间 from table where 出入='入') b on a.车辆号码=b.车辆号码

这样就求出了时间差,我没有用ceil等函数处理日期差,本来想处理的,后来觉得不处理也可以,没什么实际影响。

求出时间差就再查一遍就可以了,不过个人觉得,似乎把nvl(a.时间,sysdate)-b.时间直接放在where条件中似乎也可以,你可以试试,这样就不用再套一层了,我这里可没有环境测试。追问: 你的问题有多次入出的,我只需要最近的一次有入无出,或者入后大于30天出去的,按你的语法这段 b.号码,nvl(a.时间,sysdate)-b.时间 30 from 这段报错,其中号码为车牌列名,时间为出入时间列名,我要需要时间差在30天以上的,这段怎么改

追答:报错?有可能,因为可能要先right join然后再用这个,所以可能会有些问题。而且如果一个号码有多次出入,那么也会报错。

nvl(a.时间,sysdate)-b.时间 30 是什么鬼,我应该没这么写过吧。另外时间字段如果不是date那么自己用to_date转换。

我重复一遍,如果有多次出入,这个sql不能用,因为要判断哪次出对应哪次入,这个就会有一些麻烦。需要用到开窗函数,而且要加入判断,还要计算最后一次入后有没有出等等。

select c.车辆号码,nvl(c.时间出,sysdate)-c.时间入 时间差 from (select b.车辆号码,a.时间 时间出,b.时间 时间入 from (select 车辆号码,时间 from table where 出入='出') a right join (select 车辆号码,时间 from table where 出入='入') b on a.车辆号码=b.车辆号码)

至于多次出入,因为一般来说是“一入对一出”,不过因为各种原因可能出现两个入或者两个出连在一起,所以想找到出入的对应关系比较困难。如果前期进行了数据筛选,那还比较简单,如果要在这里筛选数据,那就麻烦了

如果确保一入对一出(重要,如果不能确保一入对一出,那么下面的方法也不能用,要进行数据筛选),那么就用分组(出入分别用车牌分组,其一排序也可以,但是那样的话,后面的操作就比较麻烦了)用时间排序,开窗函数的话rank就可以,然后将两张表(出的表和入的表)根据rank的排序进行一一对应,这样就能知道这个车每次的出入时间,这样就能知道每次的停留时间了。当然这个也有问题,就是最后一次是入,那么就要计算sysdate,所以二者也是右连接(左连接也可以,关键看哪张表在前面)然后再来计算。

如果不能确保一入对一出,需要先数据筛选,然后再来操作,那这个工作量就太大了,一个sql明显不靠谱,写个存储过程吧,那样可操作的空间就大了。

追问: 我慢慢理解吧,看来不是一个函数能解决的,基础语言看来不够用,非常感谢,看来是找对专家了!

追问: 我慢慢理解吧,看来不是一个函数能解决的,基础语言看来不够用,非常感谢,看来是找对专家了!

00分享举报

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值