我现在正在研究一个mysql数据库。我需要在表中有2列: 第一个必须以“N年M个月”的格式存储信息。 另一个:“H小时MM分钟”。 你能告诉我如何在表格中代表它吗?我知道,mysql没有提供任何时间间隔数据类型。我非常感谢你的意见。
答案 0 :(得分:0)
如果你的数据库选择没有修复,那么值得注意的是PostgreSQL有一个原生时间/日期间隔类型,可以很容易地代表你想要的间隔。
但是,让我们假设MySQL是您必须使用的。然后,您需要一种自行开发的方式来表示您的间隔,因为MySQL doesn't have any native ones。
一种简单的方法是用最小公分母来表示区间,例如"秒。" H小时和MM分钟= H * 3600 + MM * 60
。转换回H和MM将通过除法,模数或divmod
操作完成。
另一种方法是使用连接字符串,例如N年M个月= "N,M"
和H小时MM分钟= "H:MM"
。
无论哪种方式,您的逻辑(SQL和/或应用程序语言)都必须解释这些组合类型。字符串连接不是特别有效,但它在大多数编程语言中很容易分解。例如。在Python中:
years, months = [int(part) for part in yearmonth.split(',')]
它在SQL中不太方便,但left
,right
和locate
的组合可以解决问题(可能会添加{{1} })。
更大的问题是,虽然您的小时和分钟间隔是明确的,但您的年数和月数间隔则不那么明显。几年或几个月都没有固定的天数(小时,秒等)。有闰年,几个月有不同的长度。您可以将固定值视为估算值(例如cast
考虑到闰年,或考虑到100年和400年商标的特殊处理,更准确365.25 days/year
。这通常在估算时完成,例如365.2425 days/year
。请记住,这些都是估算值。如果将间隔保持为组合字符串,则可以使用外部库,例如Perl的Date::Manip,它对处理日期间隔有相当的了解。这给我们带来了最终选择:
4.33 weeks/month
。如果您要依赖外部库,也可以选择其原生格式。其他语言和库有自己喜欢的格式。在选择一个对时间流逝有语义理解的时候要小心,这个时间可以很好地映射到你的应用程序需求。不是所有人都会。例如,Python确实具有原生1:2:3:4:5:6:7
类型,但是天数是其理解中最大的单位。这可能无法很好地满足您需要数年和数月才能充分表达。如Wrikken suggests,如果您有一个支持a standard representation like ISO8601 durations的库,那就更好了。但是,我没有发现这些库与datetime.timedelta
等替代品一样普通,支持良好或功能丰富。