0

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

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

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

理想情况下,它会像

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

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

4

1 回答 1

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()。

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

于 2012-07-20T02:21:17.780 回答