50

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

4

7 に答える 7

98

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

ただし、日付を保存して、出力でフォーマットを取得したいと思います。だから、このようなものはあなたのためにトリックをするでしょう:

    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;

ここで、本当にそのフィールドを文字列として格納し、常に実行できる形式を確認する必要がある場合は、次のようにします。

CREATE TABLE my_other_table
(
id serial PRIMARY KEY not null,
my_date varchar(6) default to_char(CURRENT_DATE, 'yyyymm')
);
于 2009-05-26T14:17:47.183 に答える
17

Milen A. Radev が解決策を投稿できなかった場合に備えて、これは次のとおりです。

CREATE TABLE foo (
    key     int PRIMARY KEY,
    foo     text NOT NULL DEFAULT TO_CHAR(CURRENT_TIMESTAMP,'YYYYMM')
);
于 2009-05-26T14:27:02.720 に答える
8

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

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

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

編集:

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

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を使用します。

于 2009-05-26T13:53:12.723 に答える
2

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

しかし、この明示的なケースでは、「特別な yyyymm フィールド」は日付フィールドとしてではなく、単なるタグと見なされます。o 調査された年月値を正確に照合するために使用されるものは何でも。完全なタイムスタンプを持つ別の日付フィールドが既にありますが、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')
于 2009-05-26T14:43:18.147 に答える
-2

右。関数を使用することをお勧めします:

CREATE OR REPLACE FUNCTION yyyymm() RETURNS text
    LANGUAGE 'plpgsql' AS $$
DECLARE
    retval text;
    m integer;
BEGIN
    retval := EXTRACT(year from current_timestamp);
    m := EXTRACT(month from current_timestamp);
    IF m < 10 THEN retval := retval || '0'; END IF;
    RETURN retval || m;
END $$;

SELECT yyyymm();

DROP TABLE foo;
CREATE TABLE foo (
    key             int PRIMARY KEY,
    colname text DEFAULT yyyymm()
    );
INSERT INTO foo (key) VALUES (0);
SELECT * FROM FOO;

これは私に与えます

 key | colname 
-----+---------
   0 | 200905

createlang plpgsql必要に応じて、必ずUnixコマンドラインから実行してください。

于 2009-05-26T14:18:33.233 に答える