valor rango postgres obtener manejo insertar hoy hora fuera fechas fecha está ejemplo como actual datetime postgresql default-value

datetime - rango - ¿Cómo establecer una marca de fecha de valor predeterminado de Postgresql como ''AAAAMM''?



obtener hora de timestamp postgresql (6)

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.

Como título, ¿cómo puedo configurar la columna de una tabla para que tenga el valor predeterminado del año y mes actual, en formato ''AAAAMM'', como 200905 para hoy?


En caso de que Milen A. Radev no llegue a publicar su solución, este es:

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


Es un concepto erróneo común que se puede desnormalizar 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.


Gracias por todos los que respondieron, y gracias por aquellos que me dieron la idea de formato de función, realmente la estudiaré para usarla 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 completa, pero si necesito todas las filas de enero de 2008, creo que es más rápido seleccionar 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'')


Por qué querrías hacer esto?

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

Puede salirse con la suya especificando el formato de la columna pero con una vista. No conozco otros métodos.

Editado:

En serio, en mi opinión, deberías crear una vista en esa tabla con el 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 use v_example_table en su aplicación.


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

Sin embargo, sospecho que desea almacenar una fecha y obtener el formato en la salida. Entonces, 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 puede obtener su resultado como:

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

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

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