2013-03-09 101 views
1

我在我的數據庫中包含以字符串格式(varchar)存儲的一列日期,如"12-Mar-2011""11-Apr-2012"等。有沒有辦法在Django中比較這些日期?在Django中比較存儲爲字符串的日期

models.py中,該列被定義爲字符串格式。例如:

startdate = models.CharField(max_length=11) 

現在我必須將這些日期與日期進行比較。任何幫助表示讚賞。

回答

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') 

我省略了一些錯誤檢查(如確保有一個開始日期設定),並檢查該日期一個有效的日期或不是 - 你應該稍後添加這些。現在

,你可以這樣做:

foo = SomeModel.objects.get(pk=1) 
the_date = foo.startdate_as_date() 

現在the_date是一個datetime對象,你可以用做正常的比較。

+1

感謝您的快速回復。但現在我可以像使用obj = SomeModel.filter(the_date__gte = givenDate)一樣使用the_date了嗎? – 2013-03-11 06:30:44

+1

不,爲了做到這一點,您必須按照Francis的建議,對數據庫進行遷移並更改模型中的類型。 – 2013-03-11 06:33:39

+0

除了遷移之外,現在還有其他任何方式作爲臨時修訂來比較數據庫中存儲爲字符串的日期嗎? – 2013-03-11 07:21:24

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的日期,也許你可以用它來完成不管它是你正在嘗試做的。

+0

你的建議是100%正確的。我們必須做移民。但是現在我正在尋找這個問題的臨時解決方案。原始對象的問題是它們無法分頁。即使我們不能寫len(obj)給他們編寫我們自己的分頁函數 – 2013-03-11 07:23:44

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的月份相匹配等。