比较Django中存储为字符串的日期

时间:2013-03-09 13:29:54

标签: django django-models python-2.7

我的数据库中包含以字符串格式(varchar)存储的日期列,如"12-Mar-2011""11-Apr-2012"等。有没有办法在Django中比较这些日期?

models.py中,列被定义为字符串格式。例如:

startdate = models.CharField(max_length=11)

现在我必须将这些日期与日期进行比较。任何帮助表示赞赏。

3 个答案:

答案 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')", ())

请注意:

  • 您的数据库必须支持STR_TO_DATE。据我所知,MySQL和PostgreSQL都有这个功能。
  • 有两个%,因为RawSQL函数实际上在内部进行了一些格式化,因此必须转义%
  • 如果您请求的字段值无效,则字段值将为None。例如,如果您使用的是未使用的格式字符或无效的格式值。例如如果你试图让%m匹配一个大于12的月等等。