web-dev-qa-db-fra.com

Comment définir un horodatage de valeur par défaut Postgresql tel que 'YYYYMM'?

En tant que titre, comment définir la valeur par défaut de la colonne d'un tableau pour l'année et le mois en cours, au format "AAAAMM", comme 200905 pour aujourd'hui?

35
Strae

N'oubliez pas que le formatage de la date est indépendant du stockage. S'il est essentiel pour vous que la date soit stockée dans ce format, vous devez définir un type de données personnalisé ou le stocker sous forme de chaîne. Ensuite, vous pouvez utiliser une combinaison de extract , transtypage et concaténation pour obtenir ce format. 

Cependant, je suspecte que vous souhaitiez stocker une date et obtenir le format en sortie. Donc, quelque chose comme ça fera l'affaire pour vous:

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

(Edité pour utiliser to_char).

Ensuite, vous pouvez obtenir votre sortie comme:

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

Maintenant, si vous avez vraiment besoin de stocker ce champ sous forme de chaîne et d’assurer le format que vous pouvez toujours utiliser:

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

Juste au cas où Milen A. Radev ne publierait pas sa solution, voici le résultat:

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

Pourquoi voudriez-vous faire cela? 

IMHO vous devriez stocker la date comme type par défaut et si nécessaire le récupérer en le transformant au format souhaité.

Vous pourriez vous en sortir en spécifiant le format de la colonne mais en affichant une vue. Je ne connais pas d'autres méthodes.

Édité:

Sérieusement, à mon avis, vous devriez créer une vue sur cette table avec le type de date. Je parle de quelque chose comme ça: 

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

et que 

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

Et utilisez v_example_table dans votre application. 

9
Marcin Cylke

Merci à tous ceux qui ont répondu, et merci à ceux qui m'ont donné l'idée du format de fonction, je vais vraiment l'étudier pour une utilisation future.

Mais pour ce cas explicite, le «champ spécial yyyymm» ne doit pas être considéré comme un champ de date, mais simplement comme une balise, o tout ce qui serait utilisé pour faire correspondre la valeur recherchée année-mois exacte; il y a déjà un autre champ de date, avec l'horodatage complet, mais si j'ai besoin de toutes les lignes de janvier 2008, je pense que c'est plus rapide comme select

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

au lieu de

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

C'est une idée fausse commune que vous pouvez dénormaliser comme ceci pour la performance. Utilisez date_trunc('month', date) pour vos requêtes et ajoutez une expression d'index pour cela si vous le trouvez trop lent.

0
Charlie Clark