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

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

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

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

Python

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

Q&A

2回答

489閲覧

pythonのnow()について

mashu_ffbe

総合スコア7

MySQL

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

Python

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

0グッド

0クリップ

投稿2017/09/03 01:57

以下のようなpython形式のファイルで、5秒おきにMYSQLにデータを書き込んでいるのですが
sql = u"insert into sensor values(now(), %s,%s,%s)"%(value,t,h)の
now()のデータがyyyy-mm-dd hh:mm:ssでMYSQLに入力されます。

これをyyyy-mm-dd hh:mmで入力するように変更できないでしょうか?

import datetime
import MySQLdb

#!/usr/bin/env python

Read the analog sensor value via MCP3002.

import spidev
import time
import subprocess

import Adafruit_DHT as DHT

if name == "main":

SENSOR_TYPE = DHT.DHT11 DHT_GPIO = 4 h,t = DHT.read_retry(SENSOR_TYPE, DHT_GPIO) print "{0:0.1f}" . format(t) print "{0:0.1f}" . format(h) # open SPI device 0.0 spi = spidev.SpiDev() spi.open(0, 0) try: resp = spi.xfer2([0x68, 0x00]) value = (resp[0] * 256 + resp[1]) & 0x3ff print value time.sleep(1) except KeyboardInterrupt: spi.close() connector = MySQLdb.connect(host="localhost", db="logging", user="root", passwd="mashu0415", charset="utf8") cursor = connector.cursor() sql = u"insert into sensor values(now(), %s,%s,%s)"%(value,t,h) cursor.execute(sql) connector.commit() cursor.close() connector.close()

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

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

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

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

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

guest

回答2

0

すみませんmysqlは文字列をdatetimeに自動的に変換してはくれないようでした
str_to_dateというmysqlの関数を利用する必要があります
https://dev.mysql.com/doc/refman/5.6/ja/date-and-time-functions.html

投稿2017/09/03 13:31

calkinos

総合スコア452

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

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

mashu_ffbe

2017/09/03 13:56

sql = u"insert into sensor values('%s' ,%s,%s,%s)"%(str_to_date('%Y-%M-%D %H:%M:%S','%Y-%M-%D %H:%M:00'),value,t,h) としたところ、 NameError: name 'str_to_date' is not definedとなりました。 str_to_dateを使うためには何かimportする必要があるのでしょうか?datetimeはインポートしています。
calkinos

2017/09/04 01:57

str_to_date もMySQLの関数なので、pythonプログラム上では単なる文字列の扱いです。 sql = u"insert into sensor values(str_to_date('%s', '%%Y-%%m-%%d %%h:%%i:%%s') ,%s,%s,%s)"%(str_to_date('%Y-%M-%D %H:%M:%S','%Y-%M-%D %H:%M:00'),value,t,h) こんな感じでしょうか。 str_to_date() は 第一引数に文字列の時間を、第二引数にフォーマットをとります。 今回は pythonの%記法を利用していますので、 %Y-%m-%d %h:%i:%s で良いとこが %%Y-%%m-%%d %%h:%%i:%%s になっています。
mashu_ffbe

2017/09/04 13:28

回答ありがとうございます! 上記のようにしましたが、やはりNameError: name 'str_to_date' is not definedとなります。
calkinos

2017/09/05 08:59

すみませんコピペミスです sql = u"insert into sensor values(str_to_date('%s', '%%Y-%%m-%%d %%h:%%i:%%s') ,%s,%s,%s)"%(datetime.now().strftime('%Y-%M-%D %H:%M:00'),value,t,h)
mashu_ffbe

2017/09/05 13:44

Warning: Incorrect datetime value: '2017-09-05 22:42:00' for function str_to_date cursor.execute(sql) となります。入力したい文字列は出来ているようなのですが、なにがIncorrectなのかわかりません。
calkinos

2017/09/06 11:06

たびたびすみません良くドキュメントを読んだら %hは12時間標記で、24時間標記は%Hでした。
mashu_ffbe

2017/09/06 12:19

sql = u"insert into sensor values(str_to_date('%s', '%%Y-%%m-%%d %%H:%%i:%%S') ,%s,%s,%s)"%(datetime.now().strftime('%Y-%m-%d %H:%M:%S'),value,t,h) これで通りました! str_to_dateはMYSQL側のドキュメント、datetime.now().strftimeはpython側のドキュメントを確認しました。小文字と大文字が違うだけでも意味が変わってしまうのですね。
guest

0

MySQLのnow() を利用しているように見えますが、
pythonの質問でしょうか?

now()を利用しているということは
MySQL上ではdatetimeもしくはtimestampで扱っているかと思います。

pythonで分単位切り捨てを行おうと思うと
例えば

python

1from datetime import datetime 2 3datetime.now().strftime('%Y-%m-%d %H:%M:00')

のようになります。
出力は文字列です。
詳しくはpythonのstrftimeで利用できるformatを見てください。

一方、MySQLでは、文字列で受け取った時刻データをdatetime型としてデータベースに保存するには、
str_to_date() というMySQLの関数を利用する必要があります。

それを踏まえると

sql = u"insert into sensor values(now(), %s,%s,%s)"%(value,t,h)

sql = u"insert into sensor values(str_to_date('%s', '%%Y-%%m-%%d %%H:%%i:%%S') ,%s,%s,%s)"%(datetime.now().strftime('%Y-%m-%d %H:%M:00'),value,t,h)

のような書き方をすればよいかもしれません。
( %%H:%%i:%%S の代わりに %%Tが使えるかもしれません)

今回は%記法を利用しているため、 Python文字列中で%を使うために%%と二重に記載する必要があります。

他に format文字列というのもあり、そちらだと

sql = u"insert into sensor values(str_to_date('{}', '%Y-%m-%d %H:%i:%S') ,{},{},{})".format(datetime.now().strftime('%Y-%m-%d %H:%M:00'),value,t,h)

のように若干すっきり書けます。

投稿2017/09/03 06:40

編集2017/09/07 09:31
calkinos

総合スコア452

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

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

mashu_ffbe

2017/09/03 12:29

上記のようにしたところ、 Traceback (most recent call last): File "sensor.py", line 53, in <module> cursor.execute(sql) File "/usr/local/lib/python2.7/dist-packages/MySQLdb/cursors.py", line 205, in execute self.errorhandler(self, exc, value) File "/usr/local/lib/python2.7/dist-packages/MySQLdb/connections.py", line 36, in defaulterrorhandler raise errorclass, errorvalue _mysql_exceptions.ProgrammingError: (1064, "You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '21:28:00,638,22.0,66.0)' at line 1") となってしまいました。
calkinos

2017/09/03 12:42

スペースが入るので '%s',%s,%s,%s のようにする必要がありました。
mashu_ffbe

2017/09/03 12:54

ありがとうございます! sensor.py:54: Warning: Out of range value for column 'date' at row 1 cursor.execute(sql) というエラーに変わりました。 datetime型にしているのですが、なぜOut of range valueなのでしょうか? sql = u"insert into sensor values('%s', %s,%s,%s)"%(datetime.now().strftime('%Y-%M-%D %H:%M:00'),value,t,h)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問