0

私たちのフォームでは、最初にカテゴリ (分、時間、日、月、年) を指定して年齢を入力し、次に整数値を入力します。この方法の問題点は、年齢に一貫性がなくなることです。18 か月は 1 年よりも長く、統計分析が困難になります。

内部的には、このデータを (現在格納されているように) 2 つの整数としてではなく、間隔と整数として格納する必要があります。2 番目の整数は元の単位を示します。

ここに質問があります: 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 に答える