2016-05-23 8 views
1

Iは、次の情報を持っているテーブルを有している: - 3Y5M20Dは3年5ヶ月と20日間を表しpostgresqlにピリオドを追加するには、ピリオドは年、月、日で使用できますか?

stateCode, empCode resedencyPeriod 
10   2001  3Y5M20D 
11   2002  5Y9M25D 
12   2001  9Y9M20D 
10   2001  9Y5M25D 
11   2002  11Y11M22D 

。 今、どの従業員がどの州に滞在したかを知りたいと思います。必要な出力は次のようになります。

stateCode, empCode totalresedencyPeriod 
10   2001  12Y11M15D 
11   2002  17Y9M17D 
12   2001  9Y9M20D 

目的の出力を得るためのpostgresql関数はありますか?

+0

これが可能かもしれませんが、いくつかの月が他のものよりも長いため、この使用には注意する必要があります。 feb 01〜mar 01に滞在した人は、滞在した人が01〜jun 01になると28日間しか滞在しませんでした。これにより、「月」は時間間隔の表現が貧弱になります。その3日間の差が1ヶ月になるのは10期間しかかからないため、それらを追加することは非常に危険で誤解を招きます。 –

答えて

1

あなたはP文字でフィールドを付けることによってinterval typeresedencyPeriodをキャストすることができます

select stateCode, empCode, ('P' || resedencyPeriod)::interval 
from employee; 

statecode | empcode |   interval   
-----------+---------+-------------------------- 
     10 | 2001 | 3 years 5 mons 20 days 
     11 | 2002 | 5 years 9 mons 25 days 
     12 | 2001 | 9 years 9 mons 20 days 
     10 | 2001 | 9 years 5 mons 25 days 
     11 | 2002 | 11 years 11 mons 22 days 
(5 rows) 

select 
    stateCode, 
    empCode, 
    justify_days(sum(('P' || resedencyPeriod)::interval)) period 
from employee 
group by 1, 2 
order by 1, 2; 

statecode | empcode |   period   
-----------+---------+-------------------------- 
     10 | 2001 | 12 years 11 mons 15 days 
     11 | 2002 | 17 years 9 mons 17 days 
     12 | 2001 | 9 years 9 mons 20 days 
(3 rows) 
+0

解決策のために@klinと@ coulingを大変感謝し、この種のアプローチを使用することの長所と短所を私に知らせてくれます。 – dpilwal

1

あなたが聞いて何をすることは理論的には可能であるが、非常にお勧めできません。とにかくそれをやりたいのであれば、ここにはどうすればいいのですか。

PostgreSQLは、処理時間が非常に良いintervalデータ型を持っています。それは、日、月、年を1つの値で保存する能力を含み、基本的な算術をサポートします。

また、毎月30日と仮定する関数justify_days()が含まれています。あなたのデータが毎月30日であることを知っている限り、これは問題ありません。


私は、これは非常に危険であることを示したよう...月は28〜31日から何かを持っている可能性があるので、あなたは、単に等しいヶ月にtogeather日を追加することはできませんし、で表されているヶ月記録されていません期間。

実際には、これを(おそらくintervalタイプの)日数または別々のフィールドに開始日と終了日として記録する必要があります。これがなければ、出力には常にエラーが発生します。

+0

間隔値の合計がどのように機能するかを理解すると、何も危険はありません。間隔値の正当化された合計には、集計された統計データと同様に欠陥がある可能性があります。また、 'justify_days()'を使う必要はなく、正確な日数と月数で動作します。 – klin

+0

@klinこのように月を使用すると、「最小の驚きの原理」が破られます。 「月」という用語は、状況に応じて異なる意味の束を持っています。 「カレンダー月」と「30日」だけではありません。私が作ったポイントは、それを保つ特別な理由がなければ、月は一般的に避けなければならないということです。そうでなければ、顧客は '3年13か月96日'を見てバグ報告をしたり、税務申告書を間違って提出する。 **この問題に対する解決策は、時間間隔を合計する一般的な方法とは考えられません** –

+0

*使用間隔または日数についての一般的な議論です*。著者は、間隔の合計を選択し、すべての小道具と短所で適切な解決策を得ています。 'round(val、2)'の使用は '1.234!= 1.23'と危険ですか?それは目標の問題です。 – klin

関連する問題