1

Customerテーブルを作成していますが、属性の1つをクレジットカードの有効期限にします。形式を「MonthYear」にします。どのデータ型を使用する必要がありますか?日付を使用したいのですが、形式は年/月/日です。フォーマットを月と年のみに制限する他の方法はありますか?

4

3 に答える 3

4

日付を月の最初の日に制限できます。

create table customer (
    cc_expire date check (cc_expire = date_trunc('month', cc_expire))
);

これは失敗します:

insert into customer (cc_expire) values ('2014-12-02');
ERROR:  new row for relation "customer" violates check constraint "customer_cc_expire_check"
DETAIL:  Failing row contains (2014-12-02).

そして、これは機能します:

insert into customer (cc_expire) values ('2014-12-01');
INSERT 0 1

ただし、入力日は問いません。月のみを確認します。

select
    date_trunc('month', cc_expire) > current_date as valid
from customer;
 valid 
-------
 t

年と月を別々に抽出します。

select extract(year from cc_expire) "year", extract(month from cc_expire) "month"
from customer
;
 year | month 
------+-------
 2014 |    12

または連結:

select to_char(cc_expire, 'YYYYMM') "month"
from customer
;
 month  
--------
 201412
于 2013-02-16T22:56:17.977 に答える
0

別のアイデアとして、int []を使用して、これを行うための簡単なユーティリティを基本的に作成できます。

CREATE OR REPLACE FUNCTION exp_valid(int[]) returns bool LANGUAGE SQL IMMUTABLE as
$$ 
SELECT $1[1] <= 12 AND (select count(*) = 2 FROM unnest($1));
$$;

CREATE OR REPLACE FUNCTION first_invalid_day(int[]) RETURNS date LANGUAGE SQL IMMUTABLE AS 
$$ 
SELECT (to_date($1[2]::text || $1[1]::text, CASE WHEN $1[2] < 100 THEN 'YYMM' ELSE 'YYYYMM' END) + '1 month'::interval)::date;
$$;

これらの作品:

postgres=# select exp_valid('{04,13}');
 exp_valid 
-----------
 t
(1 row)

postgres=# select exp_valid('{13,04}');
 exp_valid 
-----------
 f
(1 row)

postgres=# select exp_valid('{04,13,12}');
 exp_valid 
-----------
 f
(1 row)

次に、これらを日付に変換できます。

postgres=# select first_invalid_day('{04,13}');
 first_invalid_day 
-------------------
 2013-05-01
(1 row)

配列は全体としてそのドメイン内の単一の値を表すため、この配列の使用は正規化規則に違反しません。1つの日付を表す2つの整数を格納しています。「{12,2}」は2002年12月、「{2,12}」は2012年2月です。それぞれがドメインの単一の値を表すため、完全にアトミックです。

于 2013-03-04T12:23:07.067 に答える
0

どちらかを使用

  • 2 桁の年の場合は char(5)、または
  • 4 桁の年の場合は char(7)。

以下のコードは、すべてのクレジット カードに一致する形式である 2 桁の年を想定しています。まず、有効期限のテーブルを作成しましょう。

create table valid_expiration_dates (
  exp_date char(5) primary key
);

では、入力してみましょう。このコードは 2013 年のものです。開始日 (現在は '2013-01-01') と月の「数」 (現在は 11 です。開始日まで 0 ~ 11 か月)。

with all_months as (
  select '2013-01-01'::date + (n || ' months')::interval months
  from generate_series(0, 11) n
)
insert into valid_expiration_dates
select to_char(months, 'MM') || '/' || to_char(months, 'YY') exp_date
from all_months;

ここで、データ テーブルに char(5) 列を作成し、そこからの外部キー参照を valid_expiration_dates.exp_date に設定します。

これで忙しい間、「exp_date」よりも「exp_month」の方がその列の名前に適しているかどうかをよく考えてください。(そうなると思います。)

于 2013-02-17T01:33:39.900 に答える