24

mysql データベース テーブルには、データ型が時間 ( http://dev.mysql.com/doc/refman/5.0/en/time.html ) の列があります。テーブル データにアクセスすると、Python はこの列の値を datetime.timedelta オブジェクトとして返します。これから時間を抽出するにはどうすればよいですか?(Python マニュアルの timedelta の目的がよくわかりませんでした)。

たとえば、テーブルの列には値「18:00:00」が含まれています Python-MySQLdb はこれを datetime.timedelta(0, 64800) として返します


以下は無視してください(異なる値を返します)-

追加: テーブルの時刻の値に関係なく、python-MySQLdb は datetime.timedelta(0, 64800) のみを返すようです。

注:私はPython 2.4を使用しています

4

2 に答える 2

44

Python が値を として返すのは奇妙ですdatetime.timedelta。おそらく を返すはずdatetime.timeです。とにかく、真夜中からの経過時間を返しているようです (表の列が午後 6:00 であると仮定)。に変換するにdatetime.timeは、次の操作を実行できます。

value = datetime.timedelta(0, 64800)
(datetime.datetime.min + value).time()

datetime.datetime.minもちろん、さらに情報が必要な場合は、 datetimedatetime.time()モジュールの一部としてドキュメント化されています。

ところで、 Adatetime.timedeltaは 2 つの値の差を表したものdatetime.datetimeです。したがって、1 つdatetime.datetimeを別のものから引くと、 が得られますdatetime.timedelta。そして、 a に a を追加するdatetime.datetimeと、datetime.timedeltaが得られますdatetime.datetime。それが上記のコードの仕組みです。

于 2009-04-18T21:04:40.427 に答える
2

MySQL の TIME 型は、Python で datetime.timedelta が行うように、時間間隔を表すことを意図しているように思えます。参照したドキュメントから:

TIME 値の範囲は「-838:59:59」から「838:59:59」です。TIME 型は 1 日の時刻 (24 時間未満である必要があります) を表すだけでなく、経過時間または 2 つのイベント間の時間間隔 (24 時間よりもはるかに長い場合があります) を表すためにも使用できるため、時間の部分が非常に大きくなる場合があります。 24 時間、または負の場合もあります)。

datetime.timedelta から datetime.time への変換に代わる方法は、日付フィールドを使用せずに、列の型を DATETIME に変更することです。

-入れる:

tIn = datetime.datetime(
    year=datetime.MINYEAR, 
    month=1, 
    day=1, 
    hour=10,
    minute=52,
    second=10
    )
cursor.execute('INSERT INTO TableName (TimeColumn) VALUES (%s)', [tIn])

-選択する:

 cursor.execute('SELECT TimeColumn FROM TableName')
 result = cursor.fetchone()
 if result is not None:
     tOut = result[0].time()
     print 'Selected time: {0}:{1}:{2}'.format(tOut.hour, tOut.minute, tOut.second)

datetime.time() は、datetime オブジェクトに対して呼び出され、時刻オブジェクトを取得します。

于 2014-10-31T09:57:54.173 に答える