2009-05-26 22 views

Respuesta

68

Tenga en cuenta que el formato de la fecha es independiente del almacenamiento. Si es esencial para usted que la fecha sea almacenada en ese formato, necesitará definir un tipo de datos personalizado o almacenarlo como una cadena. A continuación, puede usar una combinación de extract, encasillado y concatenación para obtener ese formato.

Sin embargo, sospecho que desea almacenar una fecha y obtener el formato en la salida. Por lo tanto, algo así te servirá:

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

(Editado para usar to_char).

entonces se puede obtener su salida como:

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

Ahora, si hizo realmente necesita para almacenar ese campo como una cadena y garantizar el formato siempre se puede hacer:

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

¿Por qué querrías hacer esto?

En mi humilde opinión, debe guardar la fecha como tipo predeterminado y, si es necesario, recuperarla transformándola al formato deseado.

Puedes salirte con la tarea especificando el formato de la columna pero con una vista. No conozco otros métodos.

Editado:

serio, en mi opinión, se debe crear una vista en la que una tabla con tipo de fecha. Estoy hablando de algo como esto:

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

y que

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

Y el uso de v_example_table en su aplicación.

+0

Becose lo necesito. Tengo una aplicación php que ejecuta y consulta el DB con ese valor, 'aaaamm' como '200801', '200802', etc. para recuperar los datos, y creo que tenerlo como valor predeterminado sería mejor que un SELECT campos de la tabla WHERE columna ENTRE timestamp1 Y timestamp2 – Strae

+0

Haría esto con la solución que agregué a mi respuesta. –

-1

Derecha. Es mejor usar una función:

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; 

Esto me da

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

Asegúrese de ejecutar createlang plpgsql desde la línea de comandos de Unix, si es necesario.

+0

o crea "create language plpgsql" desde psql, que es todo lo que createlang hace. – araqnid

13

Sólo en caso de Milen A. Radev no moverse a publicar su solución, eso es todo:

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

¿Dónde se ha ido la otra respuesta como esta? – Strae

+0

CURRENT_TIMESTAMP :) – zie1ony

1

Gracias por todos los que respondió, y gracias por los que me dieron la idea de la función de formato , realmente lo estudiaré para usar en el futuro.

Pero para este caso explícito, el 'campo especial yyyymm' no se debe considerar como un campo de fecha, sino solo como una etiqueta, o lo que se usaría para hacer coincidir el valor investigado exactamente del año-mes; ya hay otro campo de fecha, con la marca de tiempo completo, pero si tengo que todas las filas de enero de 2008, creo que es más rápido un selecto como

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

en lugar de

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

Es una común concepto erróneo de que puede denormalise así por el rendimiento. Use date_trunc('month', date) para sus consultas y agregue una expresión de índice para esto si lo encuentra funcionando lentamente.

Cuestiones relacionadas