2009-05-26 9 views

Odpowiedz

68

Należy pamiętać, że format daty jest niezależny od miejsca przechowywania. Jeśli ważne jest, aby data była zapisana w tym formacie w tym formacie, musisz mieć określony niestandardowy typ danych lub zapisać go jako ciąg znaków. Następnie możesz użyć kombinacji extract, typowania i konkatenacji, aby uzyskać ten format.

Podejrzewam jednak, że chcesz zapisać datę i uzyskać format wyjściowy. Tak więc coś takiego może załatwić sprawę:

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). 

(Edytowane w celu użycia to_char).

Następnie można uzyskać wyjście jak:

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

Teraz, jeśli zrobił naprawdę trzeba zapisać to pole jako ciąg i zapewnić formatu zawsze można zrobić:

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

Dlaczego chcesz to zrobić?

IMHO należy zapisać datę jako typ domyślny iw razie potrzeby pobrać ją do żądanego formatu.

Można uciec z określeniem formatu kolumny, ale z widokiem. Nie znam innych metod.

Zmieniano:

Poważnie, Moim zdaniem, należy utworzyć widok na tym stole z datą typu. Mówię o czymś tak:

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

i niż

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

I używać v_example_table w aplikacji.

+0

Becose potrzebuję go. Mam aplikację php, która uruchamia i wysyła zapytanie do bazy danych z tymi wartościami: "yyyymm" jako "200801", "200802" itd., Aby pobrać dane - i mówię, że posiadanie ich jako wartości domyślnej byłoby lepsze niż SELECT fiels FROM table WHERE kolumna MIĘDZY znacznikiem czasu1 I znacznikiem czasu2 – Strae

+0

Zrobiłbym to z rozwiązaniem dodanym do mojej odpowiedzi. –

-1

Dobrze. Lepiej użyć funkcji:

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; 

To daje mi

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

Upewnij się uruchomić createlang plpgsql z wiersza poleceń Unix, jeśli to konieczne.

+0

lub "twórz język plpgsql" z poziomu psql, który jest wszystkim, co robi createlang. – araqnid

13

wszelki wypadek Milen A. Radev nie ominąć opublikowania jego rozwiązanie, to jest to:

CREATE TABLE foo (
    key  int PRIMARY KEY, 
    foo  text NOT NULL DEFAULT TO_CHAR(CURRENT_TIMESTAMP,'YYYYMM') 
); 
+0

Gdzie nie ma drugiej takiej odpowiedzi? – Strae

+0

CURRENT_TIMESTAMP :) – zie1ony

1

Dzięki dla każdego, kto odpowiedział, a dzięki dla tych, którzy dali mi pomysł funkcja formatu , naprawdę będę się nad tym zastanawiał do przyszłego wykorzystania.

Jednak w tym konkretnym przypadku "specjalne pole yyyymm" nie jest uważane za pole daty, ale tylko jako znacznik, o cokolwiek zostanie użyte do dopasowania dokładnie zbadanej wartości z miesiąca na miesiąc; istnieje już inna dziedzina data, z pełnym znacznikiem czasu, ale jeśli muszę wszystkie wiersze stycznia 2008 roku, myślę, że jest szybszy select jak

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

zamiast

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

To nic wspólnego nieporozumienie, które można denormalizować w ten sposób dla wydajności. Użyj zapytania date_trunc('month', date) dla swoich zapytań i dodaj do tego wyrażenie indeksu, jeśli uważasz, że działa wolno.