这样存储数据库的时间和值。
datetimes val
2018-09-04 11:02:15 0.24
2018-09-04 11:55:24 0.29
2018-09-04 12:01:15 0.31
2018-09-04 12:40:55 0.40
2018-09-04 13:45:23 0.49
2018-09-04 13:55:26 0.51
2018-09-04 14:20:58 0.65
我想获取小时中最接近的时间的val和datetime。
示例datetimes = 2018-09-04 11:02:15最接近11:00:00,所以我得到(2018-09-04 11:02:15,0.24)
我知道怎么获得最接近的时间。
SELECT *
FROM ValueRecord
ORDER BY abs(strftime('%s','2018-09-04 13:00:00') - strftime('%s', datetimes))
LIMIT 1;
但它仅返回一条记录。
我想接收所有符合条件的记录
这可能是我想要的示例数据中的结果
datetimes val
2018-09-04 11:02:15 0.24 // nearest 11:00:00
2018-09-04 12:01:15 0.31 // nearest 12:00:00
2018-09-04 12:40:55 0.40 // nearest 13:00:00
2018-09-04 13:55:26 0.51 // nearest 14:00:00
是否可以在SQLite中使用SQL?如果是这样,我该怎么办?
还是应该使用外部代码?
答案 0 :(得分:2)
这是我想出的:
SELECT *
FROM ValueRecord AS VR1
WHERE NOT EXISTS (
SELECT 1
FROM ValueRecord AS VR2
WHERE (
( CAST(strftime('%H', VR1.datetimes) AS INTEGER) = CAST(strftime('%H', VR2.datetimes) AS INTEGER)
AND CAST(strftime('%M', VR1.datetimes) AS INTEGER) < 30
AND CAST(strftime('%M', VR2.datetimes) AS INTEGER) < 30 )
OR
( CAST(strftime('%H', VR1.datetimes) AS INTEGER) = CAST(strftime('%H', VR2.datetimes) AS INTEGER) - 1
AND CAST(strftime('%M', VR1.datetimes) AS INTEGER) > 29
AND CAST(strftime('%M', VR2.datetimes) AS INTEGER) < 30 )
OR
( CAST(strftime('%H', VR1.datetimes) AS INTEGER) = CAST(strftime('%H', VR2.datetimes) AS INTEGER) + 1
AND CAST(strftime('%M', VR2.datetimes) AS INTEGER) > 29
AND CAST(strftime('%M', VR1.datetimes) AS INTEGER) < 30 )
)
AND ABS(CASE WHEN CAST(strftime('%M', VR2.datetimes) AS INTEGER) > 29 THEN 3600 ELSE 0 END -
(CAST(strftime('%M', VR2.datetimes) AS INTEGER) * 60 + CAST(strftime('%S', VR2.datetimes) AS INTEGER)))
<
ABS(CASE WHEN CAST(strftime('%M', VR1.datetimes) AS INTEGER) > 29 THEN 3600 ELSE 0 END -
(CAST(strftime('%M', VR1.datetimes) AS INTEGER) * 60 + CAST(strftime('%S', VR1.datetimes) AS INTEGER)))
)
ORDER BY datetimes
LIMIT 10;
请注意结果:
datetimes val
2018-09-04 11:02:15 0.24
2018-09-04 12:01:15 0.31
2018-09-04 12:40:55 0.4
2018-09-04 13:45:23 0.49
2018-09-04 13:55:26 0.51
与您的有所不同,因为它包含的行被认为是最接近下一个小时的行。
在这里摆弄小提琴:http://sqlfiddle.com/#!5/11522/42/0
答案 1 :(得分:1)
select
date_time,
case when substr(strftime('%H.%M',date_time),4,5) <='30' then strftime('%H',date_time)
else strftime('%H',date_time)+1
end closest_hour,
value
from sample;
我将下限值和下限值设置为30,根据您的要求进行更改 sqlfiddle链接:Example