2016-10-21 31 views
0

私は、クエリをフィルタリングしようとしているデータモデルにdatefield(created_on)を持っています。私は現在のでフィルタしようとしています。週、月、年。これは、1年前、1ヶ月前、1年前と混同されることはありません。例えば現在の週、月、年の日付範囲。 Python/Flask

を(今日の日付を取り、最後の7を取得するために、Xの日付範囲/はtimedeltaを差し引く、31、365日分ではない):

現在の週:その水曜日第七は、その後、私はからフィルタリングする場合月曜日5日 - 日曜日11日..

現在の月 2月16日が2月1日〜2月29日までにフィルタリングしたい場合。

当期その3月3日2016年は、私は1月1日から2016年フィルタリングする場合 - 12月31日2016年

ふりがな例:すべてのケースで

.filter(Table.created_on BETWEEN FIRST AND LAST DAY OF THIS WEEK/MONTH/YEAR) 

答えて

1

を、あなたはLOWER_BOUND < Table.created_on < UPPER_BOUNDをしたいと思います。それを2つに分割する必要があるかもしれませんが、sqlalchemyがその部分を自動的に実行できるかどうかはわかりません。

今週は、下限を取得する曜日に応じて0〜6日を減算し、上限には0〜6を加算します。

現在の月、現在の月と年、下限はYEAR-MONTH-01、上限はYEAR-MONTH-DAYS_IN_MONTHです。

現在の年、下限はYEAR-01-01、上限はYEAR-12-31です。

この情報を入手するには、標準ライブラリからdatetimeパッケージをお試しください。これは、範囲外のうるう年を除いて、本当に簡単です。あなたが正確な時間を扱うか、エポックの制限や閏秒やタイムゾーンやDSTの実行や "Nヶ月/年前"のいずれかを扱わない限り、このようなことは複雑になりません(その場合、 "1ヶ月前「12月31日」、「1月2月29日」など)。あなたがユニットとして月や年のような可変持続時間のものを使用していない限り、日は安全にユニットとして扱うことができるように正確な時計時間は必要ありません。

# In all 
from datetime import date, timedelta 
today = date.today() 

その後、一週間:

月の
weekday = today.weekday() 
# lower bound 
mon = today - timedelta(days=weekday) 
# upper bound 
sun = today + timedelta(days=(6 - weekday)) 

days_per_month = {1: 31, 2: 29, 3: 31, ...} # you can fill this in yourself 
# lower bound 
first = today.replace(day=1) 
# upper bound 
try: 
    last = today.replace(day=days_per_month[today.month]) 
except ValueError: 
    if today.month == 2: # Not a leap year 
     last = today.replace(day=28) 
    else: 
     raise # just to be safe, in case there's some other error I missed 

そして今年の

:すべての場合において

# lower bound 
janfirst = today.replace(month=1, day=1) 
# upper bound 
declast = today.replace(month=12, day=31) 

、もし列の内容過去にあることが保証されています(例えば、彼らがdaの場合行がテーブルに追加された場合)、上限を現在の日付に置き換えることができます。または、真夜中に非常に近いところで開始されたクエリーと直後の新しいエントリーの場合は、明日の場合もあります。

+0

私はクエリのロジックを高く評価しますが、質問はPythonの日付範囲を効率的に決定するために役立ちます。下限/上限を取得する方法。 – draxous

+0

[datetime](https://docs.python.org/3.6/library/datetime。html)ライブラリは、これらのすべてを取得するための簡単な手段を提供します。 –

+0

スニペットが追加されました。標準ライブラリはあなたに「今日」を与え、それは月または年の代わりになります(週は少しの計算を必要とします)。ああ、2月の処理ですが、29thをデフォルトにして28thを使用して例外をキャッチすると、ライブラリが効果的にそれを処理します。 –

関連する問題