在MySQL中存储持续时间

时间:2018-12-26 22:08:02

标签: mysql sql time database-design

我需要在mysql中存储以下内容:

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

什么是最好的存储方式,例如不能将一个月的定义缩短为几秒。我首先想到的是将每个增量单独存储,例如:

- num_seconds
- num_minutes
- num_hours
- num_days
- num_months

这可以存储上面的内容,但是我希望有一种更直接,更省时间的方法。

2 个答案:

答案 0 :(得分:1)

我的第一个选择是使用数据类型INT将持续时间存储为秒数。这将使计算和比较操作变得快速而干净。您还可以通过减去Unix时间戳轻松计算两个日期时间值之间的持续时间。需要显示值时,可以使用mysql sec_to_time function

但是,如果您要操纵较大的持续时间(月,年),则此方法将无效。在那种情况下,我将使用iso8601 duration format在VARCHAR列上进行回退,例如P3Y6M4DT12H30M5S 3年6个月4天12小时30分钟5秒。这是一种众所周知的格式,许多应用程序都支持该格式(但操作起来会很繁琐)。

答案 1 :(得分:1)

将数月(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

Results

|         dt | months | seconds |               result |
|------------|--------|---------|----------------------|
| 2018-01-01 |     13 |    3661 | 2019-02-01T01:01:01Z |
| 2018-01-01 |    -13 |   -3661 | 2016-11-30T22:58:59Z |