<p>SQlite将日期时间存储为字符串。因此,正如其他人在评论和其他<a href="https://stackoverflow.com/a/1933735/248296">answers</a>中建议的那样,您应该使用不同的格式来存储日期,这样“日期顺序和词汇顺序是一样的”:</p>
<pre><code>import datetime as dt
import peewee as pw
db = pw.SqliteDatabase('people1.db')
class Person(pw.Model):
name = pw.CharField()
birthday = pw.DateField(formats=['%Y-%m-%d'])
class Meta:
database = db # This model uses the "people.db" database.
db.create_tables([Person])
Person.create(name='Bob0', birthday=dt.date(1940, 4, 13))
Person.create(name='Bob1', birthday=dt.date(1950, 5, 13))
Person.create(name='Bob2', birthday=dt.date(1960, 3, 13))
Person.create(name='Bob3', birthday=dt.date(1970, 3, 13))
Person.create(name='Bob4', birthday=dt.date(1980, 3, 13))
Person.create(name='Bob5', birthday=dt.date(1990, 3, 13))
base = Person.create(name="base", birthday=dt.date(1960, 3, 13))
for item in Person.select().where(Person.birthday > base.birthday):
print item.name , item.birthday
</code></pre>
<p>这样可以得到:</p>
^{pr2}$
<p><strong>更新</strong></p>
<p>我没注意到你说你不想改变数据库。在</p>
<p>这里有一个疯狂的方法来提取部分日期:</p>
<pre><code>SELECT
birthday,
CAST(substr(birthday, 1, instr(birthday, '/') - 1) AS integer),
CAST(substr(substr(birthday, instr(birthday, '/') + 1), 1, instr(substr(birthday, instr(birthday, '/') + 1), '/') - 1) AS integer),
CAST(substr(birthday, instr(birthday, '/') + instr(substr(birthday, instr(birthday, '/') + 1), '/') + 1) AS integer)
FROM person
</code></pre>
<p>我的测试数据显示:</p>
<pre><code>4/13/1940 4 13 1940
12/13/1950 12 13 1950
3/3/1960 3 3 1960
3/25/1970 3 25 1970
3/13/1980 3 13 1980
3/13/1990 3 13 1990
3/13/1960 3 13 1960
</code></pre>
<p>您可以使用以下表达式将它们与给定日期的某些部分进行比较:</p>
<pre><code>query = """
SELECT *
FROM person
WHERE
(
substr('0000' || CAST(substr(birthday, instr(birthday, '/') + instr(substr(birthday, instr(birthday, '/') + 1), '/') + 1) AS integer), -4, 4) || '-' || -- year
substr('00' || CAST(substr(birthday, 1, instr(birthday, '/') - 1) AS integer), -2, 2) || '-' || -- month
substr('00' || CAST(substr(substr(birthday, instr(birthday, '/') + 1), 1, instr(substr(birthday, instr(birthday, '/') + 1), '/') - 1) AS integer), -2, 2) -- day
) > '1960-03-03'
"""
for item in Person.raw(query):
print item.name, item.birthday
</code></pre>
<p>我在这里重建ISO日期并用它进行比较。在</p>