2025-03-30 01:50:21
你的问题有多次入出的,我只需要最近的一次有入无出,或者入后大于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明显不靠谱,写个存储过程吧,那样可操作的空间就大了。
我慢慢理解吧,看来不是一个函数能解决的,基础语言看来不够用,非常感谢,看来是找对专家了!
我慢慢理解吧,看来不是一个函数能解决的,基础语言看来不够用,非常感谢,看来是找对专家了!