質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Flask

FlaskはPython用のマイクロフレームワークであり、Werkzeug・Jinja 2・good intentionsをベースにしています。

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

SQLAlchemy

SQLAlchemyとはPython 用のORMライブラリです。MIT Licenceのオープンソースとして提供されています。

Q&A

解決済

2回答

5488閲覧

python datetimeでの取得を特定の月で取得したい

yuto36

総合スコア16

Flask

FlaskはPython用のマイクロフレームワークであり、Werkzeug・Jinja 2・good intentionsをベースにしています。

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

SQLAlchemy

SQLAlchemyとはPython 用のORMライブラリです。MIT Licenceのオープンソースとして提供されています。

0グッド

0クリップ

投稿2019/08/26 07:47

pythonでのdatetimeモジュールを使ってのデータ取得に関してわからないので
教えてください。
やりたい事は
userの誕生日の取得で


今現在の時点で今月に誕生日を迎えるuserを知りたいです。それをcountして人数を取得したい。

class User(db.Model): def __init__(self, u_name, birthday): self.name = u_name self.birthday = birthday __tablename__ = 'user' id = db.Column(db.Integer(), nullable=False, primary_key=True, autoincrement=True, unique=True, comment="ID") e_name = db.Column(db.String(255), nullable=False) birthday = db.Column(db.Date, nullable=False)

このテーブルから
今月誕生日を迎える人を抽出する場合について
教えて欲しいです。

出力はjsonで

{ "birthday": [ { "birthday_user": 5 } ] }

ここからがよくわからくて困ってます。

from datetime import datetime, date, timedelta from dateutil.relativedelta import relativedelta birth_date = db.session.query(User.birthday).all() today = datetime.today() this_month = today + relativedelta(months=0) d_month = [] for i in birth_date: d_ate.append(i) return jsonify({'birthday': d_month'}]

これで全userの誕生日を取得できたのですが

" 今月が誕生日に該当するuser "

のデータを取得、countができません。
わかる方、ご教示お願いします。
よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

Python

1from sqlalchemy import extract 2from datetime import date 3cur_month = date.today().month 4users = db.session.query(User).filter(extract('month', User.birthday) == cur_month).all()

のように、sqlalchemy.extract() にて Birthdayのデータから月のみを取得し、これを使って filter() するとよいのではないでしょうか。

以下動作確認コード

Python

1from sqlalchemy import create_engine 2from sqlalchemy import extract 3from sqlalchemy import Column, Integer, String, Date 4from sqlalchemy.ext.declarative import declarative_base 5from sqlalchemy.orm import sessionmaker 6from datetime import date 7 8engine = create_engine('sqlite:///:memory:', echo=True) 9base = declarative_base() 10 11class User(base): 12 13 def __init__(self, u_name, birthday): 14 self.name = u_name 15 self.birthday = birthday 16 17 18 __tablename__ = 'user' 19 20 id = Column(Integer(), 21 nullable=False, 22 primary_key=True, 23 autoincrement=True, 24 unique=True, 25 comment="ID") 26 name = Column(String(255), nullable=False) 27 birthday = Column(Date, nullable=False) 28 29base.metadata.create_all(engine) 30 31Session = sessionmaker(bind=engine) 32session = Session() 33session.add(User('a', date(2000,1,1))) 34session.add(User('b', date(2000,2,2))) 35session.add(User('c', date(2000,3,3))) 36session.add(User('d', date(2000,4,4))) 37session.add(User('e', date(2000,5,5))) 38session.add(User('f', date(2000,6,6))) 39session.add(User('g', date(2000,7,7))) 40session.add(User('h', date(2000,8,8))) 41session.add(User('i', date(2000,8,9))) 42session.add(User('j', date(2000,9,10))) 43session.commit() 44 45cur_month = date.today().month 46users = session.query(User).filter(extract('month', User.birthday) == cur_month).all() 47for user in users: 48 print(user.name, user.birthday) 49# h 2000-08-08 50# i 2000-08-09

投稿2019/08/27 03:16

magichan

総合スコア15898

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yuto36

2019/08/27 18:21

動きました。ありがとうございます!大変助かりました。 教えていただいたコードの中で一つわからないのでご教示お願いしたいです。 users = session.query(User).filter(extract('month', User.birthday) == cur_month).all() このコードのなかで、'month' と 'cur_month' はどういう動きをしているのでしょうか? こちらに質問する前に、調べていて 'month' の所に cur_month を入れるというのを拝見して、入れてみたらエラー出てしまったので ここに質問する事にしたのですが、どう違うのでしょうか?
magichan

2019/08/27 23:30

extract() は db.Date 型で指定したデータの中からデータの一部を抽出する関数で、第一引数でデータのどの部分を抽出するかを指定します。 で、今回は第一引数に 'month' を指定しておりますので、User.birthday データから'月'のデータのみを抽出しております。 この第一引数は’month' の他にも 'year'や 'second' などと指定することできるのですが、詳しくは MySQL のドキュメントを見てください。 https://dev.mysql.com/doc/refman/5.6/ja/date-and-time-functions.html#function_date-add の表の unit値が指定できる項目となります。少し下には EXTRACT() の説明もあります。
magichan

2019/08/27 23:35

上記のリンク先を見ていただけるとわかるのですが、この部分への 'cur_month' の指定はドキュメントに記載がありませんので、出来ない気がします。 ちなみに私のコード中の cur_month は見てわかると思いますが、一つ上の行で cur_month = date.today().month を行い、今日の月の値を cur_month に入れているだけの変数となります。
yuto36

2019/09/01 08:53

わかりやすい説明ありがとうございました。 少し理解できた気がします! 上記リンクもありがとうございました。これからの参考にしたいと思います。
guest

0

jsonは1つ前の質問で作成したので、似たような感じで作成ください。

今月が誕生日のユーザは、Flask-Sqlalchemyで以下の様に取得すれば取得可能です。
empはlistのため、len(enp)等を行えば、count可能です。

# import from datetime import datetime, timedelta from dateutil.relativedelta import relativedelta # 処理抜粋 first_day = datetime.now() - timedelta(days=datetime.utcnow().day - 1) last_day = (first_day + relativedelta(months=1)).replace(day=1) - timedelta(days=1) print(first_day.month) emp = db.session.query(User).filter( db.and_( Employee.birthday <= '{}-{}-{}'.format(last_day.year, last_day.month, last_day.day), Employee.birthday >= '{}-{}-{}'.format(first_day.year, first_day.month, first_day.day) ) ).all()

投稿2019/08/27 02:57

FiroProchainezo

総合スコア2392

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問