Python迭代一个月,在Query之间使用month

时间:2012-05-21 08:59:19

标签: python django

我有以下型号:

Deal(models.Model):
    start_date = models.DateTimeField()
    end_date = models.DateTimeField()    

我想迭代一年,

year = '2010'

对于一年中的每个月,我想执行查询以查看月份是否在start_date和end_date之间。

我如何迭代一年?使用月份进行查询?

SELECT * FROM deals WHERE month BETWEEN start_date AND end_date 

结果将告诉我,我是否在2010年1月和/或2010年2月达成了交易,等等。

1 个答案:

答案 0 :(得分:3)

  

如何迭代某一年?

您可以使用python-dateutil's rrule。使用命令pip install python-dateutil安装。

使用示例:

In [1]: from datetime import datetime

In [2]: from dateutil import rrule

In [3]: list(rrule.rrule(rrule.MONTHLY, dtstart=datetime(2010,01,01,00,01), count=12))  
Out[3]: 
[datetime.datetime(2010, 1, 1, 0, 1),
 datetime.datetime(2010, 2, 1, 0, 1),
 datetime.datetime(2010, 3, 1, 0, 1),
 datetime.datetime(2010, 4, 1, 0, 1),
 datetime.datetime(2010, 5, 1, 0, 1),
 datetime.datetime(2010, 6, 1, 0, 1),
 datetime.datetime(2010, 7, 1, 0, 1),
 datetime.datetime(2010, 8, 1, 0, 1),
 datetime.datetime(2010, 9, 1, 0, 1),
 datetime.datetime(2010, 10, 1, 0, 1),
 datetime.datetime(2010, 11, 1, 0, 1),
 datetime.datetime(2010, 12, 1, 0, 1)]
  

使用月份进行查询?

你可以像这样迭代几个月:

In [1]: from dateutil import rrule

In [2]: from datetime import datetime

In [3]: months = list(rrule.rrule(rrule.MONTHLY, dtstart=datetime(2010,01,01,00,01), count=13))

In [4]: i = 0

In [5]: while i < len(months) - 1:
   ...:         print "start_date", months[i], "end_date", months[i+1]
   ...:         i += 1
   ...:     
start_date 2010-01-01 00:01:00 end_date 2010-02-01 00:01:00
start_date 2010-02-01 00:01:00 end_date 2010-03-01 00:01:00
start_date 2010-03-01 00:01:00 end_date 2010-04-01 00:01:00
start_date 2010-04-01 00:01:00 end_date 2010-05-01 00:01:00
start_date 2010-05-01 00:01:00 end_date 2010-06-01 00:01:00
start_date 2010-06-01 00:01:00 end_date 2010-07-01 00:01:00
start_date 2010-07-01 00:01:00 end_date 2010-08-01 00:01:00
start_date 2010-08-01 00:01:00 end_date 2010-09-01 00:01:00
start_date 2010-09-01 00:01:00 end_date 2010-10-01 00:01:00
start_date 2010-10-01 00:01:00 end_date 2010-11-01 00:01:00
start_date 2010-11-01 00:01:00 end_date 2010-12-01 00:01:00
start_date 2010-12-01 00:01:00 end_date 2011-01-01 00:01:00

用查询替换“print”语句。随意根据您的需求进行调整。

可能有更好的方法,但可以做到这一点。