在 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
类型。以下是一些原因:
【讨论】:
我不明白。我不需要使用时间戳,因为:-Timestamp 不能保存 01-01-1970 之前的值(并且我需要从 00-00-000 到 xx-xx-0004 max 的值)-我不需要每次访问或修改行时更新该字段 - 我已经在使用时间戳字段 这取决于数据在表中的存储方式。只要行是inserted
或updated
,timestamp
似乎总是会更新,这可能是可取的,也可能不是。编辑:我在@superagio 回复后立即发布了这个。我同意,您可能希望将 lastrestarted
存储为日期时间。
只有在设置数据库表时告诉 MySQL ON UPDATE CURRENT_TIMESTAMP
时才会更新 TIMESTAMP
。默认情况下,除非您自己更改,否则它不会更改。
所以没有自动方法可以从秒转换为日期时间......也许我应该自己做数学并自己做。或存储秒数:)
如果您正在谈论将 unix 时间戳转换为日期时间,您可以使用 datetime.fromtimestamp()
以上是关于在 mysql 中存储 python timedelta 值的最佳方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章
mysql 5.7 json 类型 json 数组类型 普通字符串类型 10w数据 查询速度差异
在python中调用mysql存储过程并将结果写入csv文件