2012-11-02 130 views
2

我需要在mysql环境中存储正常运行时间。 正常运行时间可以从几小时到一年以上不等。我正在考虑对mysql使用DATETIME类型。 我使用Python,并从在mysql中存储python timedelta值的最佳方式是什么?

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()有一个较小的范围,不会工作,并且从秒到日期时间没有功能。也许我应该保存秒数并习惯这一点。 谢谢

回答

3

MySQL不提供一流的INTERVAL类型,哪种类型将是Python的timedelta的SQL模拟。

因此,要商店三角洲,我会建议简单地存储在一个积分领域足够大,以保持您的最大期望值的差秒。

显示三角洲在一个“这么多天,小时,分钟等”格式 - 这是你似乎在寻找的 - 我会建议在客户端代码中这样做。 timedelta对象很好地串起来,或者你可以根据自己的喜好来制作自己的格式化程序。

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

0

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

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

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

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

+0

我不明白。 我并不需要使用时间戳,因为: -Timestamp不能01-01-1970之前保存值(和我需要的范围从00-00-000到XX-XX-0004最大值) - 这不是我“T需要我每次访问时间来更新该字段或已经使用时间戳字段 – asdf

+0

这取决于数据是如何被存储在表中修改行 - 我。每当行被“插入”或“更新”时,'timestamp'总会被更新,这可能是也可能不是所希望的。 编辑:我张贴这种权利@superagio回答后。我同意,你可能希望将'lastrestarted'作为日期时间存储。如果你告诉MySQL'ON UPDATE CURRENT_TIMESTAMP' –

+0

了'TIMESTAMP'只更新,当你设置你的数据库表。默认情况下它不会改变,除非你自己这样做。 –

1

我建议你采取自己的建议,只保存秒。

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

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

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

秒是一个非常有用的方式来存储时间,习惯它! :)

相关问题