我目前正在python和SQLite中做一个小项目,我有一个csv已导入数据库,其值在表名下:Members。
每个成员都有一个" Date Joined"字段格式为m / dd / yy。下面是一些示例格式:
我无法更改csv中的值,因为当我转换此作业时,他们将使用与以下格式相同的文档
98年5月1日
97年6月4日
99年7月1日
99年8月1日
99年8月3日
99年11月20日
00年2月2日
99年1月2日
99年2月3日
我问的其中一个问题是:
检索1999-07-01之后加入的所有成员信息(yyyy-mm-dd)并且来自VA(可以忽略VA部分)
我这样做的查询就是以
开头SELECT * FROM Members WHERE "Date Joined" >= "1999-07-01" AND "State"="VA";
但我的问题是我无法转换日期(我猜测它存储在数据库中的字符串)所以它可以与" 1999-07-01"。
进行比较答案 0 :(得分:0)
您可以尝试以下查询:
SELECT *
FROM yourTable
WHERE CAST(SUBSTR(SUBSTR(join_date, INSTR(join_date, '/') + 1), INSTR(SUBSTR(join_date, INSTR(join_date, '/') + 1), '/') + 1) AS INTEGER) <= 16 OR
(
CAST(SUBSTR(SUBSTR(join_date, INSTR(join_date, '/') + 1), INSTR(SUBSTR(join_date, INSTR(join_date, '/') + 1), '/') + 1) AS INTEGER) >= 99 AND
CAST(SUBSTR(join_date, 1, INSTR(join_date, '/') - 1) AS INTEGER) >= 7
)
<强>解释强>
为这样一个丑陋的查询道歉,但是你再次使用的日期数据也非常难看。查询的逻辑是选择年份为16
或更少的所有记录,或,如果年份为99
或更高和月份为7
或更高。
这里的诀窍是仔细使用SQLite的字符串操作函数来提取我们想要的部分。要提取月份,请使用:
SUBSTR(join_date, 1, INSTR(join_date, '/') - 1)
这将从日期列中提取所有内容,但不包括第一个正斜杠。提取日期和年份需要更多工作,因为INSTR
会选择第一个匹配的字符。在这种情况下,我们可以对日期进行子字符串以删除所有内容并包括第一个正斜杠。所以可以使用以下方法提取日期和年份:
SUBSTR(sub, 1, INSRT(sub, '/') - 1) -- day
SUBSTR(sub, INSTR(sub, '/') + 1) -- year
获取sub
SUBSTR(join_date, INSTR(join_date, '/') + 1)
。