Python: Как я могу получить время от объекта datetime.timedelta? - PullRequest
22 голосов
/ 19 апреля 2009

В таблице базы данных mysql есть столбец с типом данных time (http://dev.mysql.com/doc/refman/5.0/en/time.html). При обращении к данным таблицы Python возвращает значение этого столбца в виде объекта datetime.timedelta. Как мне извлечь время из этого? (Я не совсем понял, для чего нужна timedelta из руководств по питону).

например. Столбец в таблице содержит значение «18:00:00» Python-MySQLdb возвращает это как datetime.timedelta (0, 64800)


Пожалуйста, игнорируйте то, что ниже (оно возвращает другое значение) -

Добавлено: Независимо от значения времени в таблице python-MySQLdb, похоже, возвращает только datetime.timedelta (0, 64800).

Примечание: я использую Python 2.4

Ответы [ 2 ]

36 голосов
/ 19 апреля 2009

Странно, что Python возвращает значение как datetime.timedelta. Вероятно, он должен вернуть datetime.time. В любом случае, похоже, что он возвращает прошедшее время с полуночи (при условии, что столбец в таблице - 6:00 вечера). Чтобы преобразовать в datetime.time, вы можете сделать следующее: *

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

datetime.datetime.min и datetime.time(), конечно, задокументированы как часть datetime модуля, если вам нужна дополнительная информация.

A datetime.timedelta, кстати, представляет собой разницу между двумя значениями datetime.datetime. Так что если вы вычтете одно datetime.datetime из другого, вы получите datetime.timedelta. И если вы добавите datetime.datetime с datetime.timedelta, вы получите datetime.datetime. Вот как работает приведенный выше код.

2 голосов
/ 31 октября 2014

Мне кажется, что тип TIME в MySQL предназначен для представления временных интервалов, как datetime.timedelta в Python. Из документов, на которые вы ссылались:

Значения ВРЕМЕНИ могут варьироваться от '-838: 59: 59' до '838: 59: 59'. Часть часов может быть настолько большой, потому что тип ВРЕМЯ может использоваться не только для представления времени суток (которое должно быть меньше 24 часов), но также истекшего времени или интервала времени между двумя событиями (который может быть намного больше 24 часа, или даже отрицательный).

Альтернативой преобразованию из datetime.timedelta в datetime.time может быть изменение типа столбца на DATETIME без использования полей даты.

-Insert:

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 для получения объекта времени.

...