在 mysql 中存储 python timedelta 值的最佳方法是啥?

Posted

技术标签:

【中文标题】在 mysql 中存储 python timedelta 值的最佳方法是啥?【英文标题】:What's the best way to store a python timedelta value in mysql?在 mysql 中存储 python timedelta 值的最佳方法是什么? 【发布时间】:2012-10-23 12:31:05 【问题描述】:

我需要在 mysql 环境中存储正常运行时间。 正常运行时间可以从几个小时到一年以上不等。我正在考虑为 mysql 使用 DATETIME 类型。 我正在使用 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)

这是完成这项工作的最佳方式吗?我可以使用其他解决方案吗? mysql 中的 SEC_TO_TIME() 范围较小,无法正常工作,从 sec 到 datetime 没有函数。 也许我应该节省时间并习惯它。 谢谢

【问题讨论】:

【参考方案1】:

MySQL 不提供一流的 INTERVAL 类型,该类型将是 python 的timedelta 的 SQL 模拟。

因此,为了存储增量,我建议只需将差值(以秒为单位)存储在一个足够大的整数字段中,以容纳您的最大预期值。

要以 “这么多天、几小时、几分钟等”的格式显示 delta - 这就是您似乎正在寻找的 - 我会建议在客户端代码中这样做。 timedelta 对象可以很好地字符串化,或者您可以随意滚动自己的格式化程序。

如果您在 SO 中搜索尝试格式化间隔(“X 秒前”或“X 周前”)的人,您会看到相关的方法和工具包。

【讨论】:

【参考方案2】:

我建议你采纳你自己的建议,节省时间。

根据我的经验,存储 UNIX 时间戳(自 *nix 纪元以来的秒数)几乎总是比实际日期更容易,因为它总是很容易使用。

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

然后在输出前的最后一刻格式化数据。

秒是一种非常有用的存储时间的方法,习惯吧! :)

【讨论】:

【参考方案3】:

使用数据库中的时间时,通常最好使用数据库的当前时间而不是系统的当前时间。如果您只想从数据库中获取当前正常运行时间并显示它,我会在 SQL 查询中这样做。

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

这将以秒为单位返回正常运行时间。

至于 lastrestart 字段,我将使用 MySQL TIMESTAMP 类型。以下是一些原因:

When to use datetime or timestamp

【讨论】:

我不明白。我不需要使用时间戳,因为:-Timestamp 不能保存 01-01-1970 之前的值(并且我需要从 00-00-000 到 xx-xx-0004 max 的值)-我不需要每次访问或修改行时更新该字段 - 我已经在使用时间戳字段 这取决于数据在表中的存储方式。只要行是insertedupdatedtimestamp 似乎总是会更新,这可能是可取的,也可能不是。编辑:我在@superagio 回复后立即发布了这个。我同意,您可能希望将 lastrestarted 存储为日期时间。 只有在设置数据库表时告诉 MySQL ON UPDATE CURRENT_TIMESTAMP 时才会更新 TIMESTAMP。默认情况下,除非您自己更改,否则它不会更改。 所以没有自动方法可以从秒转换为日期时间......也许我应该自己做数学并自己做。或存储秒数:) 如果您正在谈论将 unix 时间戳转换为日期时间,您可以使用 datetime.fromtimestamp()

以上是关于在 mysql 中存储 python timedelta 值的最佳方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章

怎样实现每天自动执行oracle的存储过程一次?

mysql 5.7 json 类型 json 数组类型 普通字符串类型 10w数据 查询速度差异

如何在 Oracle PL/SQL 中执行存储函数

在python中调用mysql存储过程并将结果写入csv文件

在 mysql 中存储 python timedelta 值的最佳方法是啥?

Oracle TIMEDATE 到 DATE