web-dev-qa-db-ja.com

「YYYYMM」のようなPostgresqlのデフォルト値の日付スタンプを設定する方法は?

タイトルとして、今日の200905のように、「YYYYMM」の形式で現在の年と月をデフォルト値とするようにテーブルの列を設定するにはどうすればよいですか?

38
Strae

日付のフォーマットはストレージに依存しないことに注意してください。日付がstoredであることが必要な場合は、カスタムデータ型を定義するか、文字列として保存する必要があります。次に、 extract 、型キャスト、および連結の組み合わせを使用して、その形式を取得できます。

ただし、日付を保存し、出力で形式を取得する必要があると思われます。したがって、次のようなものがあなたのためのトリックを行います:

    CREATE TABLE my_table
    (
    id serial PRIMARY KEY not null,
    my_date date not null default CURRENT_DATE
    );

(CURRENT_DATE is basically a synonym for now() and a cast to date).

(to_charを使用するように編集)。

次に、次のような出力を取得できます。

SELECT id, to_char(my_date, 'yyyymm') FROM my_table;

ここで、didがそのフィールドを文字列として保存し、常に実行できる形式を確保する必要がある場合:

CREATE TABLE my_other_table
(
id serial PRIMARY KEY not null,
my_date varchar(6) default to_char(CURRENT_DATE, 'yyyymm')
);
79
Nic Gibson

Milen A. Radevが彼のソリューションを投稿するのに手が回らない場合に備えて、これは次のとおりです。

CREATE TABLE foo (
    key     int PRIMARY KEY,
    foo     text NOT NULL DEFAULT TO_CHAR(CURRENT_TIMESTAMP,'YYYYMM')
);
15
Curt J. Sampson

なぜあなたはこれをしたいのですか?

私見では、デフォルトのタイプとして日付を保存し、必要に応じて取得して目的の形式に変換する必要があります。

列の形式を指定することで、ビューを使用して問題を回避できます。他の方法は知りません。

編集済み:

真剣に、私の意見では、日付型を持つテーブルのビューを作成する必要があります。私はこのようなことについて話している:

create table sample_table ( id serial primary key, timestamp date); 

そしてより

create view v_example_table as select id, to_char(date, 'yyyymmmm');

そして、アプリケーションでv_example_tableを使用します。

9
Marcin Cylke

回答してくれたすべての人に感謝し、関数形式のアイデアをくれた人に感謝します。将来の使用のために本当に勉強します。

ただし、この明示的なケースでは、「特別なyyyymmフィールド」は日付フィールドとしてではなく、単なるタグとして見なされます。正確に年と月の調査値を一致させるために使用されるもの。完全なタイムスタンプを備えた別の日付フィールドがすでにありますが、2008年1月のすべての行が必要な場合は、

SELECT  [columns] FROM table WHERE yearmonth = '200801'

の代わりに

SELECT  [columns] FROM table WHERE date BETWEEN DATE('2008-01-01') AND DATE('2008-01-31')
1
Strae

パフォーマンスのためにこのように非正規化できるのはよくある誤解です。クエリにdate_trunc('month', date)を使用し、実行に時間がかかる場合はインデックス式を追加します。

0
Charlie Clark