我需要在mysql中存储以下内容:
- 30 seconds
- 20 minutes, 12 seconds
- 1 month
什么是最好的存储方式,例如不能将一个月的定义缩短为几秒。我首先想到的是将每个增量单独存储,例如:
- num_seconds
- num_minutes
- num_hours
- num_days
- num_months
这可以存储上面的内容,但是我希望有一种更直接,更省时间的方法。
答案 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 |