我有一个Python程序,它使用来自数据库的历史数据,并允许用户选择日期输入。但是并非所有可能的日期都可用于数据库,因为这些是财务数据:换句话说,如果用户将插入“02/03/2014”(即星期日),他将无法在数据库中找到任何记录,因为证券交易所已经关闭。
这导致SQL问题导致在找不到记录时,SQL语句失败并且用户需要调整日期直到找到现有记录。为了避免这种情况,我想构建一个算法,它能够更改日期输入本身,选择最接近原始输入。例如,如果用户插入“02/03/2014”,则最接近的将是03/03/2014“。
我已经考虑过这样的事情,表 MyData 只包含日期值(我仍在处理正确的语法,但它只是为了表明这个想法):< / p>
con = lite.connect('C:/.../MyDatabase.db')
cur = con.cursor()
cur.execute('SELECT * from MyDates')
rowsD= cur.fetchall()
data = []
for row in rowsD:
data.append(rowsD[row])
>>>data
['01/01/2010', '02/01/2010', .... '31/12/2013']
inputDate = '07/01/2010'
differences = []
for i in range(0, len(data)):
differences.append(abs(data[i] - inputDate))
之后,我在考虑:
mV = min(differences)
data
但是,这在内存方面花了我两件事:
有没有人有更好的想法来构建它,或者知道不同的问题方法?
答案 0 :(得分:1)
我会尝试直接从数据库获取最大日期小于给定值的记录(这可以通过SQL完成)。如果在日期中在数据库中放入索引,则可以在O(log(n))中完成。这当然与“最接近”并不完全相同,但如果你将它与“最小日期大于给定的日期”结合起来,你就会实现它。
此外,如果您对数据的分布情况或多或少有所了解,例如,连续7天您拥有一些数据,那么您可以限制较小范围的数据,如[-3天,+ 3天]。
结合这两种解决方案应该会给你很好的表现。
答案 1 :(得分:1)
在小于输入日期的日期查询数据库,并取最大值。这将为您提供最接近的日期。
对称地,您可以查询较大日期的最小值以获得最接近的日期。并保持两者的首选。
这些应该是有效的查询。
SELECT MAX(Date)
FROM MyDates
WHERE Date <= InputDate;