我的数据库中包含以字符串格式(varchar)存储的日期列,如"12-Mar-2011"
,"11-Apr-2012"
等。有没有办法在Django中比较这些日期?
在models.py
中,列被定义为字符串格式。例如:
startdate = models.CharField(max_length=11)
现在我必须将这些日期与日期进行比较。任何帮助表示赞赏。
答案 0 :(得分:2)
在models.py
中,添加一个返回datetime
对象的方法,如下所示:
from datetime import datetime as dt
class SomeModel(models.Model):
# other fields
def startdate_as_date(self):
return dt.strptime(self.startdate,'%d-%b-%Y')
我省略了一些错误检查(比如确保有一个startdate设置)并检查日期是否是有效日期 - 您应该稍后添加它们。
现在你可以这样做:
foo = SomeModel.objects.get(pk=1)
the_date = foo.startdate_as_date()
现在the_date
是一个datetime
对象,您可以使用该对象进行常规比较。
答案 1 :(得分:0)
这不是您正在寻找的答案,但是......
您真的应该将您的数据库迁移到使用models.DateField
类型。
除此之外,
objects = YourModel.objects.raw("""
SELECT
STR_TO_DATE(your_string_date_field, '%e-%b-%Y') AS a_mysql_date_field,
*
FROM your_table
""")
执行原始查询以将字符串日期作为实际的mysql日期,也许您可以使用它来完成您正在尝试的任何事情。
答案 2 :(得分:0)
您还可以使用注释创建新的虚拟字段,其中包含日期时间格式的值。
from django.db.models.expressions import RawSQL
Yourmodel.objects.annotate(startdate_datetime = RawSQL("SELECT STR_TO_DATE(startdate, '%%d-%%b-%%Y')", ())
请注意:
%
,因为RawSQL函数实际上在内部进行了一些格式化,因此必须转义%
。None
。例如,如果您使用的是未使用的格式字符或无效的格式值。例如如果你试图让%m
匹配一个大于12的月等等。