我需要在mysql中存储以下持续时间:
- 30 seconds - 20 minutes, 12 seconds - 1 month
最好的存储方法是什么,因为一个月的定义不能简化为秒数。我的第一个想法是分别存储每个增量,例如:
- num_seconds - num_minutes - num_hours - num_days - num_months
这可以存储上述内容,但我希望有一种更直接、更不冗长的方法。
osh3o9ms1#
将年到月的间隔存储为整数,计算月数(12个月=1年),将天到秒的间隔存储为整数,计算秒数。然后你可以使用 DATE_ADD 函数来计算您的日期。下面是一个sql fiddle示例,显示将间隔存储为月和秒,并将它们添加到固定日期:mysql 5.6架构设置:
DATE_ADD
create table mytab (dt date); insert into mytab values (date '2018-01-01'); create table intervals (months int, seconds int); insert into intervals values (13, 3661), (-13, -3661);
查询1:
select dt , months , seconds , date_add(date_add(dt, interval months month) , interval seconds second) result from mytab cross join intervals
结果:
| dt | months | seconds | result | |------------|--------|---------|----------------------| | 2018-01-01 | 13 | 3661 | 2019-02-01T01:01:01Z | | 2018-01-01 | -13 | -3661 | 2016-11-30T22:58:59Z |
cmssoen22#
我的第一个选择是使用数据类型int将持续时间存储为秒数。这将使计算和比较操作快速而干净。此外,您还可以通过减去两个datetime值的unix时间戳来轻松计算它们之间的持续时间。当需要显示这些值时,可以使用mysql secu-to-time函数:但是,如果您希望操纵大的持续时间(月、年),这将不起作用。在这种情况下,我将使用iso8601 duration格式的varchar列,比如p3y6m4dt12h30m5s,持续3年6个月4天12小时30分5秒。这是一种众所周知的格式,许多应用程序都支持这种格式(但操作起来会更繁琐)。
2条答案
按热度按时间osh3o9ms1#
将年到月的间隔存储为整数,计算月数(12个月=1年),将天到秒的间隔存储为整数,计算秒数。
然后你可以使用
DATE_ADD
函数来计算您的日期。下面是一个sql fiddle示例,显示将间隔存储为月和秒,并将它们添加到固定日期:mysql 5.6架构设置:
查询1:
结果:
cmssoen22#
我的第一个选择是使用数据类型int将持续时间存储为秒数。这将使计算和比较操作快速而干净。此外,您还可以通过减去两个datetime值的unix时间戳来轻松计算它们之间的持续时间。当需要显示这些值时,可以使用mysql secu-to-time函数:
但是,如果您希望操纵大的持续时间(月、年),这将不起作用。在这种情况下,我将使用iso8601 duration格式的varchar列,比如p3y6m4dt12h30m5s,持续3年6个月4天12小时30分5秒。这是一种众所周知的格式,许多应用程序都支持这种格式(但操作起来会更繁琐)。