我有一个人名和生日的数据库。生日的格式是mm/dd/yyyy
,就像“3/13/1960”。在
我想提取一份特定日期后出生的人的名单。我把这个约会叫做“基地”。在
下面的程序,首先创建一个人员数据库(模拟我想使用的真实数据库),然后提取所需的列表。问题是结果并不像我预期的那样:
import datetime as dt
import peewee as pw
db = pw.SqliteDatabase('people1.db')
class Person(pw.Model):
name = pw.CharField()
birthday = pw.DateField(formats=['%m/%d/%Y'])
class Meta:
database = db # This model uses the "people.db" database.
db.create_tables([Person])
bob0 = Person(name='Bob0', birthday='4/13/1940')
bob1 = Person(name='Bob1', birthday='5/13/1950')
bob2 = Person(name='Bob2', birthday='3/13/1960')
bob3 = Person(name='Bob3', birthday='3/13/1970')
bob4 = Person(name='Bob4', birthday='3/13/1980')
bob5 = Person(name='Bob5', birthday='3/13/1990')
base = Person(name="base", birthday='3/13/1960')
bob0.save()
bob1.save()
bob2.save()
bob3.save()
bob4.save()
bob5.save()
base.save()
for item in Person.select().where(Person.birthday > base.birthday):
print item.name , item.birthday
输出:
^{pr2}$如上所示,base=3/13/1960
。所以我不应该在输出中有Bob0和Bob1!我该怎么办?在
注意,我不想更改数据库中生日的格式。我也不想获取所有行并在以后检查它们!我只想获取所需的行。
只是一些SQL函数的链接看起来很有趣,但是很有效,也许更快。在
SQlite将日期时间存储为字符串。因此,正如其他人在评论和其他answers中建议的那样,您应该使用不同的格式来存储日期,这样“日期顺序和词汇顺序是一样的”:
这样可以得到:
^{pr2}$更新
我没注意到你说你不想改变数据库。在
这里有一个疯狂的方法来提取部分日期:
我的测试数据显示:
您可以使用以下表达式将它们与给定日期的某些部分进行比较:
我在这里重建ISO日期并用它进行比较。在
您可以使用sqlite3.Connection.create_function指定您自己的sqlite函数,该函数将日期转换为可以按字典顺序排序的内容:
尽管这种方法将“只获取所需的行”,但它仍然会对每一行运行这个python函数!这比在python中进行日期比较时只获取所有行要好得多,甚至可能更慢!在
但是,
_sqlite_reformat_date
函数可以重构得更快,并且很高兴知道在sqlite中添加自定义函数有多容易。在相关问题 更多 >
编程相关推荐