Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » PostgreSQL »

Formato de Fecha en Postgres

Estas en el tema de Formato de Fecha en Postgres en el foro de PostgreSQL en Foros del Web. Buenos Días: Para la ejecución de consulta, donde tengo 2 campos tipo fecha, utilizando to_char(fechacreacion, 'dd-MM-yyyy')", me da 01-01-2010. Usando la variante to_char(fechacreacion, 'dd-Mon-yyyy'), obtengo ...
  #1 (permalink)  
Antiguo 15/11/2009, 05:45
Avatar de The_Pretorian  
Fecha de Ingreso: diciembre-2004
Ubicación: Lima - Peru
Mensajes: 267
Antigüedad: 20 años
Puntos: 0
Pregunta Formato de Fecha en Postgres

Buenos Días:
Para la ejecución de consulta, donde tengo 2 campos tipo fecha, utilizando to_char(fechacreacion, 'dd-MM-yyyy')", me da 01-01-2010.

Usando la variante to_char(fechacreacion, 'dd-Mon-yyyy'), obtengo 01-Jan-2010. Siendo ese formato el que me piden mostrar.

Para ese resultado, que cambios o formas tendría que usar. Pues me piden 01-Ene-2010

Gracias por el apoyo...

--
Atte
The Pretorian
__________________
Creo que todas las cosas suceden por algo, no es eso que los demas llaman 'Destino'. Definitivamente Dios no juega a los dados...
  #2 (permalink)  
Antiguo 15/11/2009, 06:42
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 10 meses
Puntos: 360
Respuesta: Formato de Fecha en Postgres

Realmente cual es la pregunta?
podrías poner un ejemplo?

saludos the_pretorian
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #3 (permalink)  
Antiguo 15/11/2009, 07:27
Avatar de The_Pretorian  
Fecha de Ingreso: diciembre-2004
Ubicación: Lima - Peru
Mensajes: 267
Antigüedad: 20 años
Puntos: 0
Pregunta Respuesta: Formato de Fecha en Postgres

Cita:
Iniciado por huesos52 Ver Mensaje
Realmente cual es la pregunta?
podrías poner un ejemplo?

saludos the_pretorian
Gracias por responder.

Sucede que cuando listo el contenido con to_char(fechacreacion, 'dd-Mon-yyyy'), obtengo 01-Jan-2010.

Lo que me piden mostrar es 01-Ene-2010, en resumen que los meses salgan en Español.
January -- Enero

Gracias por la ayuda que me pruedan brindar.

Atte
The Pretorian
__________________
Creo que todas las cosas suceden por algo, no es eso que los demas llaman 'Destino'. Definitivamente Dios no juega a los dados...
  #4 (permalink)  
Antiguo 15/11/2009, 07:51
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 10 meses
Puntos: 360
Respuesta: Formato de Fecha en Postgres

Como algunos meses no necesitan conversión, se puede hacer solo los que la requieren:

Código sql:
Ver original
  1. SELECT CASE
  2. WHEN EXTRACT(MONTH FROM fec)=1 THEN
  3. (EXTRACT(DAY FROM fec)||'-Ene-'||EXTRACT(YEAR FROM fec))::VARCHAR
  4. WHEN EXTRACT(MONTH FROM fec)=4 THEN
  5. (EXTRACT(DAY FROM fec)||'-Abr-'||EXTRACT(YEAR FROM fec))::VARCHAR
  6. WHEN EXTRACT(MONTH FROM fec)=8 THEN
  7. (EXTRACT(DAY FROM fec)||'-Ago-'||EXTRACT(YEAR FROM fec))::VARCHAR
  8. WHEN EXTRACT(MONTH FROM fec)=12 THEN
  9. (EXTRACT(DAY FROM fec)||'-Dic-'||EXTRACT(YEAR FROM fec))::VARCHAR
  10. ELSE to_char(fec,'dd-Mon-YYYY')
  11. END FROM fechas1;

para mi cso, el campo se llama fec, para tu caso es fechacreacion.

saludos
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #5 (permalink)  
Antiguo 16/11/2009, 20:06
Avatar de The_Pretorian  
Fecha de Ingreso: diciembre-2004
Ubicación: Lima - Peru
Mensajes: 267
Antigüedad: 20 años
Puntos: 0
Pregunta Respuesta: Formato de Fecha en Postgres

Muchas Gracias por Responder:
La sentencia funciona de lo mas bien, sin embargo tendría que usar la misma sentencia en cada consulta. En algunos casos serán hasta 4 campos, evaluando la situación lo favorable seria contar con una función, donde le envié la fecha y esta me la devuelva como se requiere.

Aquí un borrador de como seria la función[usando como base lo que me compartiste]

Código PHP:
CREATE OR REPLACE FUNCTION xcambio_fecha (timestamp)
RETURNS timestamp AS '
DECLARE
    var_fecha alias for $1;
    res_fecha timestamp;
BEGIN
    SELECT res_fecha := case
    when extract(month FROM var_fecha)=1 then (extract(day FROM var_fecha)||"-Ene-"||extract(year FROM var_fecha))::varchar
    when extract(month FROM var_fecha)=4 then (extract(day FROM var_fecha)||"-Abr-"||extract(year FROM var_fecha))::varchar
    when extract(month FROM var_fecha)=8 then (extract(day FROM var_fecha)||"-Ago-"||extract(year FROM var_fecha))::varchar
    when extract(month FROM var_fecha)=12 then (extract(day FROM var_fecha)||"-Dic-"||extract(year FROM var_fecha))::varchar
    else to_char(var_fecha,"dd-Mon-YYYY")
    end FROM var_fecha;
    
    RETURN res_fecha;
END;
LANGUAGE 'plpgsql'
Gracias por la orientación que me puedan brindar.

Atte
The Pretorian
__________________
Creo que todas las cosas suceden por algo, no es eso que los demas llaman 'Destino'. Definitivamente Dios no juega a los dados...
  #6 (permalink)  
Antiguo 16/11/2009, 20:24
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 10 meses
Puntos: 360
Respuesta: Formato de Fecha en Postgres

prueba así:
Código sql:
Ver original
  1. CREATE OR REPLACE FUNCTION xcambio_fecha(TIMESTAMP)
  2. RETURNS VARCHAR AS $body$
  3. DECLARE
  4.     var_fecha alias FOR $1;
  5.     res_fecha record;
  6. BEGIN
  7.     SELECT INTO res_fecha (CASE
  8.     WHEN EXTRACT(MONTH FROM var_fecha)=1 THEN (EXTRACT(DAY FROM var_fecha)||'-Ene-'||EXTRACT(YEAR FROM var_fecha))::VARCHAR
  9.     WHEN EXTRACT(MONTH FROM var_fecha)=4 THEN (EXTRACT(DAY FROM var_fecha)||'-Abr-'||EXTRACT(YEAR FROM var_fecha))::VARCHAR
  10.     WHEN EXTRACT(MONTH FROM var_fecha)=8 THEN (EXTRACT(DAY FROM var_fecha)||'-Ago-'||EXTRACT(YEAR FROM var_fecha))::VARCHAR
  11.     WHEN EXTRACT(MONTH FROM var_fecha)=12 THEN (EXTRACT(DAY FROM var_fecha)||'-Dic-'||EXTRACT(YEAR FROM var_fecha))::VARCHAR
  12.     ELSE to_char(var_fecha,'dd-Mon-YYYY')  
  13.     END) AS fecha;
  14.      
  15.     RETURN res_fecha.fecha::VARCHAR;
  16. END;
  17. $body$ LANGUAGE 'plpgsql';
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #7 (permalink)  
Antiguo 16/11/2009, 20:47
Avatar de The_Pretorian  
Fecha de Ingreso: diciembre-2004
Ubicación: Lima - Peru
Mensajes: 267
Antigüedad: 20 años
Puntos: 0
Pregunta Respuesta: Formato de Fecha en Postgres

Gracias por la rápida respuesta.

Me salio el siguiente mensaje.

Cita:
ERROR: function xcambio_fecha(timestamp with time zone) does not exist
SQL state: 42883
Hint: No function matches the given name and argument types. You may need to add explicit type casts.
Character: 8
A que se debería ese mensaje. Copie la función y la creo sin problemas.

Para poder probarlo estoy usando la siguiente linea.

SELECT public.xcambio_fecha2(now())



Atte
The Pretorian
__________________
Creo que todas las cosas suceden por algo, no es eso que los demas llaman 'Destino'. Definitivamente Dios no juega a los dados...

Última edición por The_Pretorian; 16/11/2009 a las 20:51 Razón: mejorar
  #8 (permalink)  
Antiguo 17/11/2009, 05:00
Avatar de xdrtas  
Fecha de Ingreso: junio-2008
Ubicación: Venezuela
Mensajes: 97
Antigüedad: 16 años, 6 meses
Puntos: 13
Respuesta: Formato de Fecha en Postgres

Cita:
Iniciado por The_Pretorian Ver Mensaje

Para poder probarlo estoy usando la siguiente linea.

SELECT public.xcambio_fecha2(now())
Veo un par de cosas mal a tu llamada a la función:
  1. La función se llama xcambio_fecha, no xcambio_fecha2, a menos que tu le hayas cambiado el nombre.
  2. No uses now(), now() te devuelve el tipo de dato timestamp with time zone, la función fue creada con el parámetro timestamp, éste es equivalente a timestamp without time zone, como puedes observar no son del mismo tipo.
  3. Usa current_date como parametro en vez de now(), a mi me funcionó perfectamente así. current_date es lo mismo que now(), solo que current_date devuelve solo la fecha, now() devuelve la fecha + la hora.

Los tipos de datos de los parametros de función tienen que coincidir con los datos que se les pasa, si no coinciden sale el error que te salió a tí.

"Hint: No function matches the given name and argument types. You may need to add explicit type casts."

Esto significa: "No hay función que coincida con el nombre y el tipo de argumento, Puede necesitar conversión explicita de tipos."

Espero que te sirva, saludos.
  #9 (permalink)  
Antiguo 17/11/2009, 07:23
Avatar de huesos52
Colaborador
 
Fecha de Ingreso: febrero-2009
Ubicación: Manizales - Colombia
Mensajes: 5.980
Antigüedad: 15 años, 10 meses
Puntos: 360
Respuesta: Formato de Fecha en Postgres

Con un ejemplo:

Código sql:
Ver original
  1. pruebas=> CREATE TABLE table1(fecha TIMESTAMP);
  2. CREATE TABLE
  3. pruebas=> INSERT INTO table1 VALUES('2009-01-01');
  4. INSERT 0 1
  5. pruebas=> INSERT INTO table1 VALUES('2009-02-01');
  6. INSERT 0 1
  7. pruebas=> INSERT INTO table1 VALUES('2009-03-01');
  8. INSERT 0 1
  9. pruebas=> INSERT INTO table1 VALUES('2009-04-01');
  10. INSERT 0 1
  11. pruebas=> INSERT INTO table1 VALUES('2009-05-01');
  12. INSERT 0 1
  13. pruebas=> INSERT INTO table1 VALUES('2009-06-01');
  14. INSERT 0 1
  15. pruebas=> INSERT INTO table1 VALUES('2009-07-01');
  16. INSERT 0 1
  17. pruebas=> INSERT INTO table1 VALUES('2009-08-01');
  18. INSERT 0 1
  19. pruebas=> INSERT INTO table1 VALUES('2009-09-01');
  20. INSERT 0 1
  21. pruebas=> INSERT INTO table1 VALUES('2009-10-01');
  22. INSERT 0 1
  23. pruebas=> INSERT INTO table1 VALUES('2009-11-01');
  24. INSERT 0 1
  25. pruebas=> INSERT INTO table1 VALUES('2009-12-01');
  26. INSERT 0 1
  27. pruebas=> SELECT fecha FROM table1;
  28.         fecha
  29. ---------------------
  30.  2009-01-01 00:00:00
  31.  2009-02-01 00:00:00
  32.  2009-03-01 00:00:00
  33.  2009-04-01 00:00:00
  34.  2009-05-01 00:00:00
  35.  2009-06-01 00:00:00
  36.  2009-07-01 00:00:00
  37.  2009-08-01 00:00:00
  38.  2009-09-01 00:00:00
  39.  2009-10-01 00:00:00
  40.  2009-11-01 00:00:00
  41.  2009-12-01 00:00:00
  42. (12 filas)
  43.  
  44. pruebas=> CREATE OR REPLACE FUNCTION xcambio_fecha(TIMESTAMP)
  45. pruebas-> RETURNS VARCHAR AS $body$
  46. pruebas$> DECLARE
  47. pruebas$>     var_fecha alias FOR $1;
  48. pruebas$>     res_fecha record;
  49. pruebas$> BEGIN
  50. pruebas$>     SELECT INTO res_fecha (CASE
  51. pruebas$>     WHEN EXTRACT(MONTH FROM var_fecha)=1 THEN (EXTRACT(DAY FROM var_fecha)||'-Ene-'||extra
  52. ct(YEAR FROM var_fecha))::VARCHAR
  53. pruebas$>     WHEN EXTRACT(MONTH FROM var_fecha)=4 THEN (EXTRACT(DAY FROM var_fecha)||'-Abr-'||extra
  54. ct(YEAR FROM var_fecha))::VARCHAR
  55. pruebas$>     WHEN EXTRACT(MONTH FROM var_fecha)=8 THEN (EXTRACT(DAY FROM var_fecha)||'-Ago-'||extra
  56. ct(YEAR FROM var_fecha))::VARCHAR
  57. pruebas$>     WHEN EXTRACT(MONTH FROM var_fecha)=12 THEN (EXTRACT(DAY FROM var_fecha)||'-Dic-'||extr
  58. act(YEAR FROM var_fecha))::VARCHAR
  59. pruebas$>     ELSE to_char(var_fecha,'dd-Mon-YYYY')
  60. pruebas$>     END) AS fecha;
  61. pruebas$>
  62. pruebas$>     RETURN res_fecha.fecha::VARCHAR;
  63. pruebas$> END;
  64. pruebas$> $body$ LANGUAGE 'plpgsql';
  65. CREATE FUNCTION
  66. pruebas=> SELECT xcambio_fecha(fecha) FROM table1;
  67.  xcambio_fecha
  68. ---------------
  69.  1-Ene-2009
  70.  01-Feb-2009
  71.  01-Mar-2009
  72.  1-Abr-2009
  73.  01-May-2009
  74.  01-Jun-2009
  75.  01-Jul-2009
  76.  1-Ago-2009
  77.  01-Sep-2009
  78.  01-Oct-2009
  79.  01-Nov-2009
  80.  1-Dic-2009
  81. (12 filas)

Como bien dice xdrtas la función now() devuelve un timestamp with time zone y mas que la fecha y la hora, también devuleve la zona horaria.

Código sql:
Ver original
  1. pruebas=> SELECT now();
  2.             now
  3. ----------------------------
  4.  2009-11-17 08:17:50.046-05
  5. (1 fila)

El -05 indica mi zona horaria Bogotá-Lima-Quito.

Como el campo que hemos declarado como entrada de la función es necesario hacer el respectivo casteo de timestamp with time zone a timestamp.

Código sql:
Ver original
  1. pruebas=> SELECT xcambio_fecha(now());
  2. ERROR:  FUNCTION xcambio_fecha(TIMESTAMP WITH TIME zone) does NOT exist
  3. LINEA 1: SELECT xcambio_fecha(now());
  4.                 ^
  5. HINT:  No FUNCTION matches the given name AND argument types. You may need TO ADD explicit TYPE CAST
  6. s.
  7. pruebas=> SELECT xcambio_fecha(now()::TIMESTAMP);
  8.  xcambio_fecha
  9. ---------------
  10.  17-Nov-2009
  11. (1 fila)

saludos
__________________
Without data, You are another person with an opinion.
W. Edwads Deming
  #10 (permalink)  
Antiguo 17/11/2009, 10:20
Avatar de The_Pretorian  
Fecha de Ingreso: diciembre-2004
Ubicación: Lima - Peru
Mensajes: 267
Antigüedad: 20 años
Puntos: 0
Respuesta: Formato de Fecha en Postgres

Buenos Dias
Muchisimas Gracias por todo el soporte que me han brindado, el resultado de la funcion es formidable.
Espero que con el tiempo pueda yo devolver o brindar un aporte similar para con esta comunidad.

Atte
The Pretorian
__________________
Creo que todas las cosas suceden por algo, no es eso que los demas llaman 'Destino'. Definitivamente Dios no juega a los dados...
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 02:10.