Jako tytuł, jak ustawić kolumnę tabeli, aby miała domyślną wartość bieżącego roku i miesiąca, w formacie "RRRRMM", na przykład 200905 na dziś?Jak ustawić datownik z domyślną wartością PostgreSQL jak "RRRRMM"?
Odpowiedz
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')
);
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.
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.
lub "twórz język plpgsql" z poziomu psql, który jest wszystkim, co robi createlang. – araqnid
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')
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.
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
Zrobiłbym to z rozwiązaniem dodanym do mojej odpowiedzi. –