比较SQLite中的日期

时间:2016-08-26 04:13:34

标签: python sql database sqlite

我目前正在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"。

进行比较

1 个答案:

答案 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)