用于存储PHP DateInterval的MySQL数据类型

时间:2017-03-16 15:08:02

标签: php mysql

我想将PHP DateInterval存储在MySQL数据库中。

用于此目的的最佳数据库数据类型是什么,以便我可以序列化DateInterval? (即我想存储它,然后再从数据库值创建一个DateInterval。)

2 个答案:

答案 0 :(得分:3)

我建议存储DateInterval构造函数的区间规范,如“P35D”,“P1DT24M39S”等。

我选择这个的原因:

  1. 这很简单。如果您让用户选择特定的时间间隔,我假设您有一个表单,其中包含不同时间单位的不同输入。从输入中创建其中一个字符串会非常简单,而不是在时间单位之间转换来存储int。

  2. 它相对紧凑。不像 将它转换为一个时间单位并将其存储为int那样紧凑,但比序列化DateInterval对象和存储整个事物要紧凑得多。

  3. 我可能忽略了一个让其他事情成为更好选择的因素,但我主要是想分享我之前评论的推理。

    如果您最初没有像我假设的那样直接从用户那里获得间隔,而是从DateTime::diff(或其他我没有想到的东西)获得间隔,您仍然可以从宾语。它有公共属性存储您需要的所有部分。这样的事情应该有效:

    function getIntervalSpec(DateInterval $interval) {
        $spec = 'P';
        foreach(['y', 'm', 'd', 'h', 'i', 's'] as $u) {
            if ($u == 'h') $spec .= 'T';
            $spec .= $interval->$u;
            $spec .= $u == 'i' ? 'M' : strtoupper($u);
        }
        return $spec;
    }
    

答案 1 :(得分:3)

您可以使用$interval->format("P%yY%mM%dDT%hH%iM%sS");的构造函数格式序列化:invert

但是,存在陷阱。您无法通过构造函数恢复days(符号)或天数DateTime->diff(DateTime)。这两个属性直接由format初始化。如果您不需要此信息,serialize($interval)就可以了。但如果您需要,data_col = ["46", "47", "48", "49", "50", "51", "52"] def method(arg) results = [] i = 0 while i < arg.length current_num = arg[i].to_i next_num = arg[i + 1].to_i next_num - current_num != 1 ? results << current_num : nil i += 1 end return results end p method(data_col) #[52] 是最佳选择。