3

次の 2 つの可能性が頭に浮かびます。

  • NUMBER(4)
  • DATE

プロNUMBER(4)

  • UNIQUE として指定した場合、重複エントリは不可
  • 簡単な算数(足し算、引き算)

短所NUMBER(4)

  • 検証なし (例: 負の数)

プロDATE

  • 検証

短所DATE

  • 重複エントリが可能です ('2013-06-24'、'2013-06-23'、...)
  • 計算が簡単ではない (1 を足す = ADD_MONTHS(12))

追加の要件として、列は現在の年と比較されますEXTRACT (YEAR FROM SYSDATE)。私の意見NUMBER(4)では、より良い選択です。私が見逃した別のオプションはありますか?

4

3 に答える 3

3

date必要に応じて、関数ベースのインデックスを使用して、列を年に 1 つのエントリのみに制限できます。

create unique index uq_yr on <table> (trunc(<column>, 'YYYY'));

同じ年に 2 つの日付を挿入しようとすると、ORA-00001 エラーが発生します。もちろん、残りの日付が必要ない場合は、それを保持するのは役に立たなかったり、混乱したりする可能性がありますが、一方で、保持したい二次的な情報があるかもしれません (たとえば、年次監査を記録している場合)。完全な日付を保持しても問題はないかもしれません)。truncおそらく、より簡単に操作できるように、値を保持する仮想列 (11g 以降) を使用することもできます。

また、interval year(4) to monthデータ型を使用しnumtoyminterval(2013, 'year')、 などを使用して挿入することもできます。間隔演算を実行して、年を加算および減算しextract、年を数値として取得することもできます。date全体として、それはおそらくを使用するよりも苦痛になるでしょう。

本当に年だけに関心がある場合 (そして、月を別の列に保持していない場合)、数値はおそらく最も単純で、妥当な数値であることを確認するためのチェック制約が適用されます。number(4)停止しません。2.013意図したときに挿入します2,013(ただし、文字列からヒットするには変換する必要があり、NLS パラメーターの不一致はありません) 2

于 2013-06-24T15:31:39.083 に答える