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

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

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

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

2回答

10672閲覧

特定の日付(一日)を抽出するSQLをpythonで実装したいです。(DBのtimestampは2016-05-20 03:39:43のような形式です。)

kento2543

総合スコア163

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2016/06/24 08:17

編集2016/06/24 08:33

DBはmysql
pythonのプログラムで、実装してます。

次のようなテーブルにおいて、特定の日付のデータのみを取得したいです。

hogesテーブル created_at 2016-05-20 03:39:43 2016-05-29 03:29:43 2016-05-29 03:39:43 2016-05-30 03:39:43

また、これはバッチ処理として実行します。(一日一回か、週に一度実行することを想定してます。)

そのため、特定の日付というのはバッチ処理の実行日時になります。

今回は仮に、2016-05-20のデータのみを取得したいとします。

SQLで考えると、以下のようなSQLを生成するのかなと思いました。

SELECT `hoges`.* FROM `hoges` WHERE (created_at between "2016-05-20 00:00:00" and "2016-05-20 23:59:59");

尚、mysql.connectorというライブラリを使っておりますが、
もっといいライブラリがありましたら、そちらを使おうと思います。
http://qiita.com/mima_ita/items/9a5ab3b45c7575776b06

そこで質問ですが

・バッチ処理の実行した日付の範囲内のデータを取得する場合、
pythonではどのように実装すればいいのでしょうか?

・上で記述したような生のsqlだと、冗長な気がしますが、もっとスッキリとした実装方法がありましたら、
ご指摘頂けますと幸いです。

以上よろしくお願いします。

補足

pythonでのmysqlの実行の仕方は以下の方法であれば、知っております。

cnn = mysql.connector.connect(host='localhost', port=3306, db='Sample001', user='root', passwd='root', charset="cp932") cur = cnn.cursor() #試験データの整理 pref_cd = 100 cur.execute("""DELETE FROM t01prefecture WHERE PREF_CD >= %s""" , (pref_cd,))

今回わからないのは、

・バッチ処理の実行した日付の範囲内のデータを取得するという処理をSQLもしくは、pythonで実現する方法

です。

ごちゃごちゃと書いてしまい、ややこしくなってしまいました。

よろしくお願いします。

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

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

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

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

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

lightson

2016/06/24 08:29

このSQL文をpythonでどのように作るかという質問と理解してよろしいでしょうか。?
kento2543

2016/06/24 08:34

質問本文に補足として追記しました。
guest

回答2

0

Pythonは不勉強なので

・上で記述したような生のsqlだと、冗長な気がしますが、もっとスッキリとした実装方法がありましたら、

ご指摘頂けますと幸いです。

のみ、回答させていただきますと、DATE()関数で以下のように書けます。
https://dev.mysql.com/doc/refman/5.6/ja/date-and-time-functions.html#function_date

sql

1SELECT `hoges`.* FROM `hoges` WHERE DATE(created_at) = "2016-05-20";

ただし、この記述方法ではcreated_atカラムにインデックスが張ってあったとしても、それを使えなくなります。
状況によっては、ご質問のSQLの方が良いパフォーマンスを得られると思います。


・バッチ処理の実行した日付の範囲内のデータを取得するという処理をSQLもしくは、pythonで実現する方法

であれば、以下のいずれかのSQL文で実現可能です。

sql

1SELECT `hoges`.* FROM `hoges` WHERE created_at >= CURRENT_DATE() AND created_at < ADDDATE(CURRENT_DATE(), 1); 2 3SELECT `hoges`.* FROM `hoges` WHERE DATE(created_at) = CURRENT_DATE();

投稿2016/06/24 08:35

編集2016/06/24 08:41
KiyoshiMotoki

総合スコア4791

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

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

0

SQL文は、このように書けると思います。

python

1import datetime 2now = datetime.datetime.now() 3start_t = now.strftime("%Y-%m-%d ") + "00:00:00" 4stop_t = now.strftime("%Y-%m-%d ") + "23:59:59" 5txt = 'SELECT `hoges`.* FROM `hoges` WHERE (created_at between "{}" and "{}");'.format(start_t,stop_t) 6print txt

結果

sql

1SELECT `hoges`.* FROM `hoges` WHERE (created_at between "2016-06-24 00:00:00" and "2016-06-24 23:59:59");

投稿2016/06/24 09:13

lightson

総合スコア553

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問