[RESUELTO] Formato de Fecha desde Consulta
#1
Escrito 28 marzo 2011 - 10:48
La necesidad es que desde la consulta yo pueda concatenar el folio de un documento con la fecha de su creación y así generar un nuevo campo. Ésto no me genera mayor problema, si no fuera porque el formato de la fecha se desea como dd/mm/yy.
Por situaciones que no vienen al caso, me sería de mucha ayuda poder hacer ésto desde la consulta, y evitarme mucho re-trabajo en que Delphi se encargue de hacer el formato y la concatenación.
Utilizando el Extract para los campos de día mes y año, me genera fechas del tipo 1/1/11 y no 01/01/11 que sería lo que busco...
Algún comentario al respecto amigos ?
Saludox y Gracias !
#2
Escrito 28 marzo 2011 - 11:04
Personalmente creo que lo más indicado es dar formato en Delphi, pero si quieres hacerlo desde Firebird, para dar ese formato 04 al número 4, por ejemplo, yo lo que hago es sumarle 100 y después pasarlo a carácter, cogiendo solo los carácteres dos y tres.
Es decir.
select substring(cast(extract(day from FECHA) + 100 as varchar(3)) from 2 for 2) || '/' || substring(cast(extract(month from FECHA) + 100 as varchar(3)) from 2 for 2) || '/' || cast(extract(year from FECHA) as varchar(4)) from TABLA
Saludos
Hola a todos chicos y chicas, ando aquí con una pequeña cuestión sobre formatos de fechas directamente en Firebird....
La necesidad es que desde la consulta yo pueda concatenar el folio de un documento con la fecha de su creación y así generar un nuevo campo. Ésto no me genera mayor problema, si no fuera porque el formato de la fecha se desea como dd/mm/yy.
Por situaciones que no vienen al caso, me sería de mucha ayuda poder hacer ésto desde la consulta, y evitarme mucho re-trabajo en que Delphi se encargue de hacer el formato y la concatenación.
Utilizando el Extract para los campos de día mes y año, me genera fechas del tipo 1/1/11 y no 01/01/11 que sería lo que busco...
Algún comentario al respecto amigos ?
Saludox y Gracias !
#3
Escrito 28 marzo 2011 - 11:16
Hola.
Personalmente creo que lo más indicado es dar formato en Delphi, pero si quieres hacerlo desde Firebird, para dar ese formato 04 al número 4, por ejemplo, yo lo que hago es sumarle 100 y después pasarlo a carácter, cogiendo solo los carácteres dos y tres.
Es decir.
delphi
select substring(cast(extract(day from FECHA) + 100 as varchar(3)) from 2 for 2) || '/' || substring(cast(extract(month from FECHA) + 100 as varchar(3)) from 2 for 2) || '/' || cast(extract(year from FECHA) as varchar(4)) from TABLA
Saludos
Hola a todos chicos y chicas, ando aquí con una pequeña cuestión sobre formatos de fechas directamente en Firebird....
La necesidad es que desde la consulta yo pueda concatenar el folio de un documento con la fecha de su creación y así generar un nuevo campo. Ésto no me genera mayor problema, si no fuera porque el formato de la fecha se desea como dd/mm/yy.
Por situaciones que no vienen al caso, me sería de mucha ayuda poder hacer ésto desde la consulta, y evitarme mucho re-trabajo en que Delphi se encargue de hacer el formato y la concatenación.
Utilizando el Extract para los campos de día mes y año, me genera fechas del tipo 1/1/11 y no 01/01/11 que sería lo que busco...
Algún comentario al respecto amigos ?
Saludox y Gracias !
Gracias Marc !!! Pruebo y comento ...
Saludox !
#4
Escrito 28 marzo 2011 - 11:38
Me manda un error de "Arithmetic overflow or division by zero has ocurred. Arithmetic exception, numeric overflow, or string truncation"
Hice una prueba haciendo todo por separado de tal manera que quedara así:
[firebird]
substring(cast(extract(day from FECHA) + 100 as varchar(3)) from 2 for 2) as DIA,
substring(cast(extract(month from FECHA) + 100 as varchar(3)) from 2 for 2) AS MES,
cast(extract(year from FECHA) as varchar(4)) AS ANNIO,
[/firebird]
Y me genera el mismo error.... Otra observación, si hago la concatenación directa de FOLIO || FECHA, los resultados de las fechas me los muestra 31-AUG-2010 y de ésta manera todos
Comentarios ?
Saludox !
#5
Escrito 28 marzo 2011 - 11:55
¿ Seguro que el error no te lo da en otra sección de la consulta ?.
Si copias la consulta que has probado, con tu nombre de tabla y campos, le echo un vistazo.
Saludos.
#6
Escrito 28 marzo 2011 - 12:02
Te agradezco tu ayuda... la consulta completa es ésta:
[firebird]
SELECT
P.PAT_AGEN||'-'||P.NUM_PEDI AS PEDIME, P1.PAT_AGEN||'-'||P1.NUM_PEDI AS PEDREC,
P.NUM_REFE, P.FEC_PAGO, P.IMP_EXPO, P.CVE_PEDI, P.TIP_CAMB, P.ADU_DESP, P.FAC_AJUS,
NULL AS COL7, P.PES_BRUT, NULL AS COL1,
(SELECT CVE_PAI2 FROM CTARC_PAISES WHERE CVE_PAI = F.PAI_VEND) AS PAI_VEND,
(SELECT CVE_PAI2 FROM CTARC_PAISES WHERE CVE_PAI = F.PAI_ORIG) AS PAI_ORIG,
P.CVE_IMPO, A.ICO_FACT, A.CVE_PROV,
CASE P.IMP_EXPO WHEN '1' THEN (SELECT NOM_PRO FROM CTRAC_PROVED WHERE (CVE_PRO=A.CVE_PROV))
WHEN '2' THEN (SELECT NOM_PRO FROM CTRAC_DESTIN WHERE (CVE_PRO=A.CVE_PROV)) END AS PROVE,
NULL AS COL2, P.MAR_NUME,
/* PRUEBA 1 -> ERROR
CAST(A.NUM_FACT AS CHAR (10)) ||' DEL '|| substring(cast(extract(day from A.FEC_FACT) + 100 as varchar(3)) from 2 for 2) || '/' ||
substring(cast(extract(month from A.FEC_FACT) + 100 as varchar(3)) from 2 for 2) || '/' ||
cast(extract(year from A.FEC_FACT) as varchar(4)) AS FACTURA, */
/* PRUEBA 2 -> ERROR
substring(cast(extract(day from A.FEC_FACT) + 100 as varchar(3)) from 2 for 2) as DIA,
substring(cast(extract(month from A.FEC_FACT) + 100 as varchar(3)) from 2 for 2) AS MES,
cast(extract(year from A.FEC_FACT) as varchar(4)) AS ANNO,
*/
A.NUM_FACT || ' DEL ' || A.FEC_FACT AS FACTURA, /* PRUEBA 3 -> OK*/
P.CAN_BULT, NULL AS COL3, NULL AS COL4, A.VAL_EXTR, A.VAL_DLLS, P.VAL_COME,
((SELECT SUM(IMP_INCR) FROM SAAIO_INCREM WHERE NUM_REFE = P.NUM_REFE) + (SELECT SUM(IMP_INCR) FROM SAAIO_NOINCR WHERE NUM_REFE = P.NUM_REFE)) AS TOT_GASTOS,
P.VAL_NORM, P.FAC_ACTU, F.ADVAL,
(SELECT SUM(TOT_IMPU) FROM SAAIO_CONTPED WHERE (NUM_REFE=P.NUM_REFE) AND (CVE_IMPU='1')) AS DTA,
(SELECT SUM(TOT_IMPU) FROM SAAIO_CONTFRA WHERE (NUM_REFE=P.NUM_REFE) AND (CVE_IMPU='3')) AS IVA, NULL AS COL5,
(SELECT SUM(TOT_IMPU) FROM SAAIO_CONTPED WHERE (NUM_REFE=P.NUM_REFE) AND (CVE_IMPU='15')) AS PREV, '0' AS FP,
(SELECT SUM(VAL_TASA) FROM SAAIO_CONTPED WHERE (NUM_REFE=P.NUM_REFE)) AS SUBTOTAL,
(SELECT COUNT(NUM_REFE) FROM SAAIO_CONTPED WHERE (NUM_REFE=P.NUM_REFE)) AS TOTPAR,
(SELECT SUM(TOT_IMPU) FROM SAAIO_CONTPED WHERE (NUM_REFE=P.NUM_REFE)) AS TOTAL,
(SELECT MAR_NUME FROM SAAIO_PEDIME WHERE (NUM_REFE=P.NUM_REFE)) AS MARCAS,
CASE P.PAT_AGEN WHEN '3468' THEN '70'
WHEN '3012' THEN '22' END AS CVE_AGEN,
(SELECT SUM(TOT_EFEC) FROM SAAIO_PEDIME WHERE NUM_REFE = P.NUM_REFE) AS TOT_EFEC,
NULL AS COL6, (SELECT NUM_CONT FROM SAAIO_CONTEN WHERE NUM_REFE = P.NUM_REFE) AS NUM_CONTEN,
(SELECT CT.NOM_TRAN FROM CTRAC_TRANSP CT INNER JOIN SAAIO_TRANSP ST ON ST.CVE_TRANSP = CT.CVE_TRAN WHERE ST.NUM_REFE = P.NUM_REFE) AS NOM_TRANSP
FROM SAAIO_PEDIME P
LEFT OUTER JOIN SAAIO_PEDIME P1 ON (P.NUM_REFEO = P1.NUM_REFE)
LEFT OUTER JOIN SAAIO_FACTUR A ON (A.NUM_REFE = P.NUM_REFE) AND (A.CONS_FACT = 1)
LEFT OUTER JOIN SAAIO_FACPAR F ON (F.NUM_REFE = P.NUM_REFE) AND (F.CONS_FACT = 1) AND (F.CONS_PART = 1)
LEFT OUTER JOIN SAAIO_CONTEN O ON (P.NUM_REFE = O.NUM_REFE)
LEFT OUTER JOIN SAAIO_TRANSP T ON (T.NUM_REFE = P.NUM_REFE)
LEFT OUTER JOIN CTRAC_TRANSP N ON(T.CVE_TRANSP = N.CVE_TRAN)
WHERE P.FEC_PAGO IS NOT NULL
AND P.CVE_IMPO = '19' AND P.FEC_PAGO BETWEEN '01/01/2009' AND '11/09/2011' AND P.ADU_DESP= '800'
[/firebird]
Gracias !
#7
Escrito 28 marzo 2011 - 12:13
Una sugerencia
[/Off Topic]
#8
Escrito 28 marzo 2011 - 12:15
Primero, pruebas lo mínimo, y después vas añadiendo campos, hasta localizar donde tienes el error :
Es decir, primero prueba :
SELECT P.PAT_AGEN||'-'||P.NUM_PEDI AS PEDIME, P1.PAT_AGEN||'-'||P1.NUM_PEDI AS PEDREC FROM SAAIO_PEDIME P LEFT OUTER JOIN SAAIO_PEDIME P1 ON (P.NUM_REFEO = P1.NUM_REFE) LEFT OUTER JOIN SAAIO_FACTUR A ON (A.NUM_REFE = P.NUM_REFE) AND (A.CONS_FACT = 1) LEFT OUTER JOIN SAAIO_FACPAR F ON (F.NUM_REFE = P.NUM_REFE) AND (F.CONS_FACT = 1) AND (F.CONS_PART = 1) LEFT OUTER JOIN SAAIO_CONTEN O ON (P.NUM_REFE = O.NUM_REFE) LEFT OUTER JOIN SAAIO_TRANSP T ON (T.NUM_REFE = P.NUM_REFE) LEFT OUTER JOIN CTRAC_TRANSP N ON(T.CVE_TRANSP = N.CVE_TRAN) WHERE P.FEC_PAGO IS NOT NULL AND P.CVE_IMPO = '19' AND P.FEC_PAGO BETWEEN '01/01/2009' AND '11/09/2011' AND P.ADU_DESP= '800'
Y si funciona bien, ve añadiendo cláusulas, es decir, la siguiente prueba :
SELECT P.PAT_AGEN||'-'||P.NUM_PEDI AS PEDIME, P1.PAT_AGEN||'-'||P1.NUM_PEDI AS PEDREC, P.NUM_REFE, P.FEC_PAGO, P.IMP_EXPO, P.CVE_PEDI, P.TIP_CAMB, P.ADU_DESP, P.FAC_AJUS FROM SAAIO_PEDIME P LEFT OUTER JOIN SAAIO_PEDIME P1 ON (P.NUM_REFEO = P1.NUM_REFE) LEFT OUTER JOIN SAAIO_FACTUR A ON (A.NUM_REFE = P.NUM_REFE) AND (A.CONS_FACT = 1) LEFT OUTER JOIN SAAIO_FACPAR F ON (F.NUM_REFE = P.NUM_REFE) AND (F.CONS_FACT = 1) AND (F.CONS_PART = 1) LEFT OUTER JOIN SAAIO_CONTEN O ON (P.NUM_REFE = O.NUM_REFE) LEFT OUTER JOIN SAAIO_TRANSP T ON (T.NUM_REFE = P.NUM_REFE) LEFT OUTER JOIN CTRAC_TRANSP N ON(T.CVE_TRANSP = N.CVE_TRAN) WHERE P.FEC_PAGO IS NOT NULL AND P.CVE_IMPO = '19' AND P.FEC_PAGO BETWEEN '01/01/2009' AND '11/09/2011' AND P.ADU_DESP= '800'
Hasta que veas donde está el error.
#9
Escrito 28 marzo 2011 - 12:19
Utilizando la misma concatenación que he hecho antes, te paso una forma de simplificar su uso. Para ello te puedes definir tu propia función de formateo de Fechas.
SET TERM ^ ; CREATE PROCEDURE "spFECHA" ( VALOR TIMESTAMP) RETURNS ( FECHA VARCHAR(10)) AS BEGIN FECHA = SUBSTRING(CAST(EXTRACT(DAY FROM VALOR) + 100 AS VARCHAR(3)) FROM 2 FOR 2); FECHA = FECHA || '/'; FECHA = FECHA || SUBSTRING(CAST(EXTRACT(MONTH FROM VALOR) + 100 AS VARCHAR(3)) FROM 2 FOR 2); FECHA = FECHA || '/'; FECHA = FECHA || CAST(EXTRACT(YEAR FROM VALOR) AS VARCHAR(4)); suspend; END ^ SET TERM ; ^
Ahora cuando quieras devolver una fecha con formato, puedes utilizar una subconsulta a ese procedimiento almacenado.
Por ejemplo (vamos a consultar el número y la fecha "con formato" de tus facturas) :
select NUM_FACT, (select FECHA from "spFECHA"(FEC_FACT)) from SAAIO_FACTUR
Así queda más bonito, ¿ verdad ?.
#10
Escrito 28 marzo 2011 - 12:21
Utiliza esto amiguis....
substring(100+extract(day from fec_fact) from 2 for 2)||'-'||
substring(100+extract(month from fec_fact) from 2 for 2)||'-'||
extract(year from fec_fact)
Salud OS
#11
Escrito 28 marzo 2011 - 12:23
[Off Topic]
Una sugerenciade mosca cojoneraa los administradores, ¿no trae el formateador de código Firebird las negritas para palabras reservadas?
[/Off Topic]
Y si no se cambia amigo Andrés, no hay problema, enecumene sabe como hacer eso
Salud OS
#12
Escrito 28 marzo 2011 - 12:36
Amigo Marc !, así se ve super simple, lo voy a implementar porque es un requisito de las fechas que estará presentándose frecuentemente , te agradezco mucho la ayuda
Y ponemos éste hilo como RESUELTO
Gracias y Saludox !
#13
Escrito 28 marzo 2011 - 08:42
Un poco tarde pero este código te funciona también, pero debe estar corriendo FB >= 2.1.
[firebird]SELECT LPAD(EXTRACT(DAY FROM CURRENT_DATE), 2, '00') ||'-'||
LPAD(EXTRACT(MONTH FROM CURRENT_DATE), 2, '00') ||'-'||
EXTRACT(YEAR FROM CURRENT_DATE)
FROM RDB$DATABASE[/firebird]