如何在mysql中描述interval数据类型?

时间:2014-11-25 20:57:50

标签: mysql time

我现在正在研究一个mysql数据库。我需要在表中有2列: 第一个必须以“N年M个月”的格式存储信息。 另一个:“H小时MM分钟”。 你能告诉我如何在表格中代表它吗?我知道,mysql没有提供任何时间间隔数据类型。我非常感谢你的意见。

1 个答案:

答案 0 :(得分:0)

如果你的数据库选择没有修复,那么值得注意的是PostgreSQL有一个原生时间/日期间隔类型,可以很容易地代表你想要的间隔。

但是,让我们假设MySQL是您必须使用的。然后,您需要一种自行开发的方式来表示您的间隔,因为MySQL doesn't have any native ones

  1. 一种简单的方法是用最小公分母来表示区间,例如"秒。" H小时和MM分钟= H * 3600 + MM * 60。转换回H和MM将通过除法,模数或divmod操作完成。

  2. 另一种方法是使用连接字符串,例如N年M个月= "N,M"和H小时MM分钟= "H:MM"

    无论哪种方式,您的逻辑(SQL和/或应用程序语言)都必须解释这些组合类型。字符串连接不是特别有效,但它在大多数编程语言中很容易分解。例如。在Python中:

    years, months =  [int(part) for part in yearmonth.split(',')]
    

    它在SQL中不太方便,但leftrightlocate的组合可以解决问题(可能会添加{{1} })。

  3. 更大的问题是,虽然您的小时和分钟间隔是明确的,但您的年数和月数间隔则不那么明显。几年或几个月都没有固定的天数(小时,秒等)。有闰年,几个月有不同的长度。您可以将固定值视为估算值(例如cast考虑到闰年,或考虑到100年和400年商标的特殊处理,更准确365.25 days/year。这通常在估算时完成,例如365.2425 days/year。请记住,这些都是估算值。如果将间隔保持为组合字符串,则可以使用外部库,例如Perl的Date::Manip,它对处理日期间隔有相当的了解。这给我们带来了最终选择:

    1. 选择外部区间解释库,并提交使用其间隔编码。例如,Date::Manip::Delta将7个字段(年,月,周,日,小时,分钟和秒)压缩为冒号分隔的字符串,例如4.33 weeks/month。如果您要依赖外部库,也可以选择其原生格式。其他语言和库有自己喜欢的格式。在选择一个对时间流逝有语义理解的时候要小心,这个时间可以很好地映射到你的应用程序需求。不是所有人都会。例如,Python确实具有原生1:2:3:4:5:6:7类型,但是天数是其理解中最大的单位。这可能无法很好地满足您需要数年和数月才能充分表达。如Wrikken suggests,如果您有一个支持a standard representation like ISO8601 durations的库,那就更好了。但是,我没有发现这些库与datetime.timedelta等替代品一样普通,支持良好或功能丰富。