【问题标题】:postgreSQL - return interval as time typepostgreSQL - 作为时间类型返回间隔
【发布时间】:2012-07-19 05:24:02
【问题描述】:

在我们拥有的表格中,人们将通过首先指定一个类别(分钟、小时、天、月、年)然后输入一个整数值来输入年龄。这种做法的问题是年龄变得不一致 - 18 个月大于 1 年,这使得统计分析变得困难。

在内部,我需要将此数据存储为不是两个整数(因为它当前存储),而是作为一个间隔和一个整数。第二个整数表示原始单位。

这是一个问题:告诉 postgreSQL 将此间隔返回为输入时间的简单方法是什么?例如,用户输入:18 个月。现在,它将以 1 年 6 个月的形式返回。 -- 无法在表单上重新显示。我根据另一个整数知道他们输入的内容,因此不会有小数部分 - 即如果他们以天为单位输入,则不会有小时数,等等。

理想情况下是这样的

SELECT as_time((person.age).value,'months')

请注意,这些间隔按原样输入,因此月份不会是 30 天间隔“月”(代表月份)以外的任何内容。如果需要,我可以使用 plpgsql 函数,因为我需要查找时间类型代码;但在所有情况下的严格要求是,如果他们输入了某个时间,他们就会准确地返回那个时间,没有四舍五入,没有“更正”等。

【问题讨论】:

    标签: postgresql plpgsql intervals


    【解决方案1】:
    WITH x(unit, t) AS (
        VALUES
         (1, interval '1 month')
        ,(1, interval '2 month')
        ,(1, interval '3 month')
        ,(1, interval '12 month')
        ,(1, interval '13 month')
        ,(1, interval '18 month')
        ,(1, interval '24 month')
        ,(1, interval '30 month')
        ,(1, interval '300 month')
        ,(2, interval '1 year')
        ,(2, interval '2 year')
        ,(2, interval '5 year')
        ,(2, interval '100 year')
        )
    SELECT CASE unit
             WHEN 1 THEN EXTRACT(year FROM t)::int * 12
                     + EXTRACT(month FROM t)::int 
             WHEN 2 THEN EXTRACT(year FROM t)::int
             ELSE -1 -- should not occour
             END AS units
          ,CASE unit
             WHEN 1 THEN 'months'
             WHEN 2 THEN 'years'
             ELSE 'unknown' -- should not occour
           END as unit
    FROM   x;
    

    EXTRACT() in the manual.

    您可以尝试提取 epoch 值(秒数)并将其转换 - 就像 @Magnus 演示 here 一样,但月份和年份对于月份的不规则性质是合理的,因此计算将与更大的间隔。

    【讨论】:

    • 我注意到当你降到小时/分钟时也会出现问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-18
    • 2020-06-21
    • 1970-01-01
    相关资源
    最近更新 更多