求SQL语句,条件离某个时间最近的数据。

时间:2022-04-30 03:03:53
表数据如下:
CAR_ID CAR_MODEL_ID CAN_USE CAR_DATE CAR_BELONG_CITY_ID CAR_BELONG_STORE_ID CAR_AT_CITY_ID CAR_AT_STORE_ID
54 107 1 2012-8-13 22:10:00 26 7
54 107 1 2012-8-13 22:20:00 26 7
54 107 1 2012-8-13 22:30:00 26 7
54 107 1 2012-8-13 22:40:00 26 7
54 107 1 2012-8-13 22:50:00 26 7
54 107 1 2012-8-13 23:00:00 26 7
54 107 1 2012-8-13 23:10:00 26 7
54 107 1 2012-8-13 23:20:00 26 7
54 107 1 2012-8-13 23:30:00 26 7
54 107 1 2012-8-13 23:40:00 26 7


表中的时间时固定格式的,每十分钟一条,查询条件也是时间点,动态获取,格式不固定的,需要查询的结果是离提供时间点最经的时间对应的数据。。。

例如:提供的时间时2012-8-13 23:30:01,那么查询出来的数据有两条,分别为时间2012-8-13 23:30:00、2012-8-13 23:40:00对应的数据,也就是时间的前一条和后一条数据,如正好相等,值获取一条数据。。。

7 个解决方案

#1


select acctime from (select acctime,row_number() over(order by acctime desc) idx from ac_placestockbook where acctime<sysdate ) where idx=1

#2


可以将表拆分两部分
1.拆分为<=条件时间和>=条件时间的两种资料。
2.分别抓1中最大和最小时间的资料。
3.求2中的并集。

#3


(1) 取最小时间差
select min(abs(date1-date2))
from ....
(2) 计算正负时间差的后的时间,然后判断该时间是否存在

#4


第一步实现了,取出两条数据。


with
s1 as (select * from CAR_STATE_107 where car_id=54 and rownum=1 and car_date>=to_date('2012-8-13 20:40:04','yyyy-MM-dd hh24:mi:ss') order by car_date),
s2 as (select * from CAR_STATE_107 where car_id=54 and rownum=1 and car_date<=to_date('2012-8-13 20:40:04','yyyy-MM-dd hh24:mi:ss') order by car_date desc)
select * from s1 union all select * from s2

#5


结果为:

CAR_ID CAR_MODEL_ID CAN_USE CAR_DATE CAR_BELONG_CITY_ID CAR_BELONG_STORE_ID CAR_AT_CITY_ID CAR_AT_STORE_ID CAR_USE_MODE USE_NO UPD_USER_ID UPD_DATE
54 107 1 2012-8-13 20:50:00 26 7 2012-5-13 0:00:17
54 107 1 2012-8-13 20:40:00 26 7 2012-5-13 0:00:17


开始如何在sql语句里面用条件判断呢?

要求:如果car_use相同,那么随便取一条数据就可以,否则取car_use=0的那条数据。。。

#6


CAR_DATE - :日期
绝对值排序

#7


如果car_use只有0和1两个值则可以按照car_use列升序排序,然后取第一行即可。

#1


select acctime from (select acctime,row_number() over(order by acctime desc) idx from ac_placestockbook where acctime<sysdate ) where idx=1

#2


可以将表拆分两部分
1.拆分为<=条件时间和>=条件时间的两种资料。
2.分别抓1中最大和最小时间的资料。
3.求2中的并集。

#3


(1) 取最小时间差
select min(abs(date1-date2))
from ....
(2) 计算正负时间差的后的时间,然后判断该时间是否存在

#4


第一步实现了,取出两条数据。


with
s1 as (select * from CAR_STATE_107 where car_id=54 and rownum=1 and car_date>=to_date('2012-8-13 20:40:04','yyyy-MM-dd hh24:mi:ss') order by car_date),
s2 as (select * from CAR_STATE_107 where car_id=54 and rownum=1 and car_date<=to_date('2012-8-13 20:40:04','yyyy-MM-dd hh24:mi:ss') order by car_date desc)
select * from s1 union all select * from s2

#5


结果为:

CAR_ID CAR_MODEL_ID CAN_USE CAR_DATE CAR_BELONG_CITY_ID CAR_BELONG_STORE_ID CAR_AT_CITY_ID CAR_AT_STORE_ID CAR_USE_MODE USE_NO UPD_USER_ID UPD_DATE
54 107 1 2012-8-13 20:50:00 26 7 2012-5-13 0:00:17
54 107 1 2012-8-13 20:40:00 26 7 2012-5-13 0:00:17


开始如何在sql语句里面用条件判断呢?

要求:如果car_use相同,那么随便取一条数据就可以,否则取car_use=0的那条数据。。。

#6


CAR_DATE - :日期
绝对值排序

#7


如果car_use只有0和1两个值则可以按照car_use列升序排序,然后取第一行即可。