【问题标题】:Storing a duration in mysql在mysql中存储持续时间
【发布时间】:2018-12-26 22:08:01
【问题描述】:

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

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

最好的存储方式是什么,因为一个月的定义不能减少,例如,秒数。我的第一个想法是单独存储每个增量,例如:

- num_seconds
- num_minutes
- num_hours
- num_days
- num_months

这可以存储上述内容,但我希望有一种更直接、更简洁的方式来执行此操作。

【问题讨论】:

  • 也许通过使用 linux 时间戳?存储两个时间戳,你可以得到秒、分钟、小时、天、月、年。
  • 问题是你将如何使用结果。如果你只需要一个间隔来显示,一个字符串就足够了。
  • @RaymondNijland 可能适用于大多数情况,例如标准化的anchor 然后interval
  • 间隔值是否限制在它们通常使用的数字范围内,例如秒 = 0-59,小时 = 0-23 等等?

标签: mysql sql database time database-design


【解决方案1】:

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

但是,如果您希望操纵较大的持续时间(月、年),这将不起作用。在这种情况下,我会使用 iso8601 duration format 的 VARCHAR 列,例如 P3Y6M4DT12H30M5S 3 年、6 个月、4 天、12 小时、30 分钟和 5 秒。这是一种广为人知的格式,许多应用程序都支持(但操作起来会更加繁琐)。

【讨论】:

  • 几个月你会用什么,因为它取决于开始日期?年份取决于它是否是闰年。
  • 问题具体是说一个月的定义不能简化,比如一个数字就是秒。
  • @Barmar:是的,你是对的。我想我的回答太快了……我仔细看了一遍这个问题并更新了我的答案。
  • 这样更好,但是您将如何在 MySQL 计算中使用 ISO8601 持续时间?我不认为 MySQL 可以直接使用它。
  • @barmar,虽然 MySQL 无法一次性处理整个持续时间字符串,但您可以将其拆分为 year_month 和 day_second 部分并与 date_add 函数一起使用:date_add(mydate, interval 'P3Y6M' year_month) date_add(mydate, interval '4DT12H30M5S' day_second)像我的回答一样做整个事情。
【解决方案2】:

将年到月的间隔存储为一个整数,计算月数(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 |

【讨论】:

    猜你喜欢
    • 2011-05-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多