在mysql中存储持续时间

yizd12fk  于 2021-06-17  发布在  Mysql
关注(0)|答案(2)|浏览(385)

我需要在mysql中存储以下持续时间:

- 30 seconds
- 20 minutes, 12 seconds
- 1 month

最好的存储方法是什么,因为一个月的定义不能简化为秒数。我的第一个想法是分别存储每个增量,例如:

- num_seconds
- num_minutes
- num_hours
- num_days
- num_months

这可以存储上述内容,但我希望有一种更直接、更不冗长的方法。

osh3o9ms

osh3o9ms1#

将年到月的间隔存储为整数,计算月数(12个月=1年),将天到秒的间隔存储为整数,计算秒数。
然后你可以使用 DATE_ADD 函数来计算您的日期。下面是一个sql fiddle示例,显示将间隔存储为月和秒,并将它们添加到固定日期:
mysql 5.6架构设置:

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 |
cmssoen2

cmssoen22#

我的第一个选择是使用数据类型int将持续时间存储为秒数。这将使计算和比较操作快速而干净。此外,您还可以通过减去两个datetime值的unix时间戳来轻松计算它们之间的持续时间。当需要显示这些值时,可以使用mysql secu-to-time函数:
但是,如果您希望操纵大的持续时间(月、年),这将不起作用。在这种情况下,我将使用iso8601 duration格式的varchar列,比如p3y6m4dt12h30m5s,持续3年6个月4天12小时30分5秒。这是一种众所周知的格式,许多应用程序都支持这种格式(但操作起来会更繁琐)。

相关问题