如何在SQLite3中正确获取当前周或未来7天的数据?
解决SQLite查询当前日期至未来7天记录的问题
你的问题出在日期格式的字符串比较逻辑上:把日期格式化为dd-mm-yyyy的字符串后,SQLite会按字典序而非实际日期顺序判断大小。比如跨年时,28-12-2024的字符串值会比04-01-2025大,导致BETWEEN条件逻辑混乱,查询结果出错。
下面是两种更可靠的解决方案:
方案一:直接传递Python datetime对象(推荐)
SQLite支持直接接收Python的datetime对象,会自动转换为yyyy-mm-dd格式的字符串(符合日期比较的正确顺序),无需手动格式化:
self.con = sqlite3.connect('car dealership.db') self.cursorObj = self.con.cursor() now = datetime.now() future_7_days = now + timedelta(days=7) # 直接传入日期对象,SQLite自动处理格式 self.cursorObj.execute(''' SELECT sellername, paymentdate, paymentvalue, car FROM cars_buying_checks WHERE paymentdate BETWEEN ? AND ? ''', (now.date(), future_7_days.date())) # 用date()只保留日期部分,排除时间干扰 self.buying_checks_row_main_week_output = self.cursorObj.fetchall()
方案二:用SQLite日期函数转换格式(适配现有存储)
如果你的paymentdate字段确实存储的是dd-mm-yyyy格式字符串,可以在SQL中先转换为标准日期格式再比较:
self.con = sqlite3.connect('car dealership.db') self.cursorObj = self.con.cursor() # 生成标准格式的日期字符串 now = datetime.now().strftime('%Y-%m-%d') future_7_days = (datetime.now() + timedelta(days=7)).strftime('%Y-%m-%d') self.cursorObj.execute(''' SELECT sellername, paymentdate, paymentvalue, car FROM cars_buying_checks -- 将dd-mm-yyyy格式转换为SQLite可识别的日期 WHERE DATE(paymentdate, '%d-%m-%Y') BETWEEN ? AND ? ''', (now, future_7_days)) self.buying_checks_row_main_week_output = self.cursorObj.fetchall()
如果条件允许,建议把数据库中paymentdate字段的存储格式统一改为yyyy-mm-dd,这样后续所有日期相关的查询、排序操作都会更准确高效。
内容的提问来源于stack exchange,提问作者asaad kittaneh
相关产品推荐
相关产品推荐

