我正在尝试根据 SQLite 中的 max(date) 列获取一年的数据。我的逻辑适用于我在下面编写的 SQL Server。
代码:
"select * from {} t where NAME in {} and t.DATE1 > " \
"(select date(year, -1, max(t1.DATE1)) from {} t1)".format(TABLE_NAME, list_of_names,
TABLE_NAME)
从 SQLite 表中获取我的查询有任何更改吗?
在 SQLite 中,日期操作函数与 SQL Server 中的不同,这解释了为什么您现有的查询不能直接运行。 SQLite 使用
strftime
函数进行日期操作。要根据列中的最大日期获取一年的数据,您需要调整查询以使用 SQLite 的日期函数。
以下是修改 SQLite 查询的方法:
SELECT *
FROM {} t
WHERE NAME IN {} AND t.DATE1 >
(SELECT date(max(t1.DATE1), '-1 year') FROM {} t1)
此查询执行以下操作:
SELECT * FROM {} t
:选择表格中的所有列(将 {}
替换为 TABLE_NAME
)。
WHERE NAME IN {}
:过滤 NAME
列与 list_of_names
中的值匹配的行(将 {}
替换为您的姓名列表)。
AND t.DATE1 > (SELECT date(max(t1.DATE1), '-1 year') FROM {} t1)
:该子查询查找表中的最大日期并从中减去一年。然后,外部查询选择 DATE1
列大于此计算日期的行。
确保为 SQL 查询正确设置
list_of_names
格式。如果是 Python 列表,则需要将其转换为适合 SQL 的字符串格式,例如 ('name1', 'name2', ...)
。
Python 中的最终查询将如下所示:
query = "SELECT * FROM {} t WHERE NAME IN {} AND t.DATE1 > (SELECT date(max(t1.DATE1), '-1 year') FROM {} t1)".format(TABLE_NAME, tuple(list_of_names), TABLE_NAME)
确保
TABLE_NAME
和 list_of_names
的格式正确并经过清理,以防止 SQL 注入攻击,尤其是来自用户输入的攻击。