[Flask-SQLAlchemy] n日以内に誕生日が来るユーザーを近い順に並び替える

User テーブルが birth_date のDateTime 型のカラムを持っていると想定しています。

import datetime
from sqlalchemy import  db, extract, and_
...

def upcoming_birth_date_users(within_days):
    now = datetime.datetime.now()
    # monthdays に within_days の分だけ[(月,日),...]を格納
    monthdays = [(now.month,now.day)]
    then = now + datetime.timedelta(days = within_days)

    while now <= then:
        now += datetime.timedelta(days=1)
        monthdays.append((now.month,now.day))

    months = [monthday[0] for monthday in monthdays]
    days = [monthday[1] for monthday in monthdays]
    # monthdays に含まれているユーザー一覧を取得
    users = db.session.query(User).filter(and_(
        extract('month',User.birth_date).in_(months),
        extract('day',User.birth_date).in_(days),
    )).all()

    # 現在日時から誕生日が近い順に sorted_users にユーザーを格納
    sorted_users = []
    for monthday in monthdays:
        month = monthday[0]
        day = monthday[1]
        matched_users = [matched_user for matched_user in users if matched_user.birth_date.month == month and
         matched_user.birth_date.day == day]
        for matched_user in matched_users:
            # 重複していなければ sorted_users に格納
            duplicates = [sorted_user for sorted_user in sorted_users if sorted_user.id == matched_user.id]
            if len(duplicates) == 0:
                sorted_users.append(matched_user)

    return sorted_users

使い方

30日以内に誕生日を迎えるユーザー一覧を取得したい場合の呼び出しは以下になります。

upcoming_birth_date_users(30)

Related Contents

Pickup Contents