今天遇到一个有意思的问题记录一下,在数据库id乱序的情况下,时间排序获取某条数据的前后两条数据。
我们可以看到,在id乱序的情况下,我们再sql中根据时间排序,可以使用:
select * from basic_market_min_stock where date = '2021-10-27 07:33:56'
获取到我们已知的数据, 用:
select * from basic_market_min_stock where date < '2021-10-27 07:33:56' order by date desc LIMIT 1
获取前一条数据,也就是id为7的数据:
获取后一条数据,也就是id为67的数据:
select * from basic_market_min_stock where date > '2021-10-27 07:33:56' order by date asc limit 1
以上就是用sql获取的方法:
那么我们如果不用sql,在java代码中怎么处理呢?
一个简单的方法,封装id和时间放进对象数组中,再通过时间获取。
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class ds {
public static void main(String[] args) throws ParseException {
//格式化
SimpleDateFormat ft = new SimpleDateFormat ("yyyy-MM-dd hh:mm:ss");
//插入模拟时间
Date date1 = ft.parse("2021-12-13 09:23:21");
Date date2 = ft.parse("2021-12-13 09:23:22");
Date date3 = ft.parse("2021-12-13 09:23:23");
Date date4 = ft.parse("2021-12-13 09:23:24");
//创建时间数组
Date[] date = {date1,date2,date3,date4};
//设置目标时间
Date date5 = ft.parse("2021-12-13 09:23:23");
Date[] code = get3code(date, date5);
System.out.println(code[0]);
System.out.println(code[1]);
System.out.println(code[2]);
}
//获取时间方法:
public static Date[] get3code(Date[] arr, Date num){
Date[] newArr = new Date[3];
for (int i = 0; i < arr.length; i++) {
//不能是数组的最后一个
if(i+1<arr.length && arr[i].equals(num)){
//把前,中,后放入数组
newArr[0]=arr[i-1];
newArr[1]=arr[i];
newArr[2]= arr[i+1];
break;
}
}
return newArr;
}
}
执行结果: