1

私は次のモデルを持っています:

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月に取引をしたかどうかなどを教えてくれます。

4

1 に答える 1

4

特定の年をどのように繰り返すことができますか?

python-dateutil の 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」ステートメントをクエリに置き換えます。必要に応じて自由に調整してください。

おそらくもっと良い方法がありますが、それは仕事をすることができます。

于 2012-05-21T09:11:19.560 に答える