Каков наилучший способ сохранить значение timedelta python в mysql?

Мне нужно сохранить время безотказной работы в среде mysql. Время безотказной работы может варьироваться от нескольких часов до более чем одного года. Я рассматривал возможность использования типа DATETIME для mysql. Я работаю с python, и время безотказной работы получается из

def convertdate(lastrestart):
   # now in datetime
   nowdt=datetime.now()

   # last_restarted in datetime
   lastrestarted_dt=datetime.strptime(lastrestart, "%Y-%m-%d %H:%M:%S")

   # timedelta in datetime! 
   uptimeInDT=nowdt-lastrestarted_dt

   #timedelta in seconds
   secondsUptime=uptimeInDT.seconds

   # string conversion wont work so much for a datetime field.
   print str(uptimeInDT)

Это лучший способ для выполнения этой работы? Должен ли я использовать другие решения? SEC_TO_TIME() в mysql имеет меньший диапазон и не будет работать, и нет функции от секунды до даты и времени. Может, мне стоит сэкономить секунды и привыкнуть к этому. Спасибо


person asdf    schedule 02.11.2012    source источник


Ответы (3)


MySQL не предлагает первоклассный тип INTERVAL, который был бы аналогом SQL типа timedelta в Python.

Таким образом, чтобы сохранить дельту, я предлагаю просто сохранить разницу в секундах в интегральном поле, достаточно большом, чтобы вместить максимальное ожидаемое значение.

Чтобы отобразить дельту в формате "столько дней, часов, минут и т. д." — именно это вы, кажется, ищете, — я предлагаю сделать это в клиентском коде. timedelta объекты красиво преобразуются в строки, или вы можете свернуть свой собственный форматировщик, как вам нравится.

Если вы будете искать в SO людей, пытающихся отформатировать интервалы («X секунд назад» или «X недель назад»), вы увидите соответствующие подходы и наборы инструментов.

person pilcrow    schedule 02.11.2012

Я бы посоветовал вам принять собственное предложение и просто сэкономить секунды.

По моему опыту, почти всегда проще хранить временную метку UNIX (секунды с эпохи * nix), чем фактическую дату, потому что с ней всегда легко работать.

http://en.wikipedia.org/wiki/Unix_time

Затем просто отформатируйте данные в последний момент перед выводом.

Секунды — очень полезный способ хранить время, привыкайте! :)

person DigitalDesignDj    schedule 02.11.2012

При работе со временем из базы данных обычно лучше использовать текущее время базы данных, а не текущее время системы. Если вы просто хотите получить текущее время безотказной работы из базы данных и отобразить его, я бы сделал это в запросе SQL.

SELECT NOW()-lastrestart AS uptime FROM ...

Это вернет время безотказной работы в секундах.

Что касается поля lastrestart, я бы использовал тип MySQL TIMESTAMP. Вот несколько причин почему:

person Nathan Villaescusa    schedule 02.11.2012
comment
Я не понимаю. Мне не нужно использовать метку времени, потому что: -Временная метка не может содержать значения до 01-01-1970 (и мне нужны значения в диапазоне от 00-00-000 до xx-xx-0004 max) - мне не нужно обновлять это поле каждый раз, когда я обращаюсь к строке или изменяю ее - я уже использую поле временной метки - person asdf; 03.11.2012
comment
Это зависит от того, как данные хранятся в таблице. Кажется, что timestamp всегда обновляется всякий раз, когда строка inserted или updated, что может быть или не быть желательным. редактировать: я разместил это сразу после того, как @superagio ответил. Я согласен, вы, вероятно, хотите сохранить lastrestarted как дату и время. - person Brendan Moore; 03.11.2012
comment
TIMESTAMP обновляется только в том случае, если вы указываете MySQL ON UPDATE CURRENT_TIMESTAMP при настройке таблицы базы данных. По умолчанию он не изменится, если вы не сделаете это сами. - person Nathan Villaescusa; 03.11.2012
comment
поэтому нет автоматического способа преобразования секунд в дату и время ... может быть, мне следует заняться математикой и сделать это самостоятельно. или сохранить секунды :) - person asdf; 03.11.2012
comment
Если вы говорите о привязке временной метки unix к дате и времени, вы можете использовать datetime.fromtimestamp() - person Nathan Villaescusa; 03.11.2012