Ir al contenido


Foto

[RESUELTO] Formato de Fecha desde Consulta


  • Por favor identifícate para responder
12 respuestas en este tema

#1 Fenareth

Fenareth

    Advanced Member

  • Administrador
  • 3.486 mensajes
  • LocationMexico City

Escrito 28 marzo 2011 - 10:48

Hola a todos chicos y chicas, ando aquí con una pequeña cuestión sobre formatos de fechas directamente en Firebird....  :sad:


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 ?  ^o|


Saludox y Gracias :) !
  • 0

#2 Marc

Marc

    Advanced Member

  • Moderadores
  • PipPipPip
  • 1.484 mensajes
  • LocationMallorca

Escrito 28 marzo 2011 - 11:04

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
  1. select substring(cast(extract(day from FECHA) + 100 as varchar(3)) from 2 for 2) || '/' ||
  2.           substring(cast(extract(month from FECHA) + 100 as varchar(3)) from 2 for 2) || '/' ||
  3.           cast(extract(year from FECHA) as varchar(4))
  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  !


  • 0

#3 Fenareth

Fenareth

    Advanced Member

  • Administrador
  • 3.486 mensajes
  • LocationMexico City

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
  1. select substring(cast(extract(day from FECHA) + 100 as varchar(3)) from 2 for 2) || '/' ||
  2.           substring(cast(extract(month from FECHA) + 100 as varchar(3)) from 2 for 2) || '/' ||
  3.           cast(extract(year from FECHA) as varchar(4))
  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 (y)...

Saludox ! :)
  • 0

#4 Fenareth

Fenareth

    Advanced Member

  • Administrador
  • 3.486 mensajes
  • LocationMexico City

Escrito 28 marzo 2011 - 11:38

Aquí con los resultados...
Me manda un error de "Arithmetic overflow or division by zero has ocurred. Arithmetic exception, numeric overflow, or string truncation"


8o|  :     


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 ?    :embarrassed:


Saludox !


  • 0

#5 Marc

Marc

    Advanced Member

  • Moderadores
  • PipPipPip
  • 1.484 mensajes
  • LocationMallorca

Escrito 28 marzo 2011 - 11:55

Acabo de probar esa consulta que te puse, para comprobar que no haya escrito mal los paréntesis, ..., y me ha funcionado correctamente (ya he utilizado alguna vez esa concatenación).

¿ 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.
  • 0

#6 Fenareth

Fenareth

    Advanced Member

  • Administrador
  • 3.486 mensajes
  • LocationMexico City

Escrito 28 marzo 2011 - 12:02

Claro Marc !


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  !
  • 0

#7 andres1569

andres1569

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 431 mensajes

Escrito 28 marzo 2011 - 12:13

[Off Topic]
Una sugerencia de mosca cojonera  a los administradores, ¿no trae el formateador de código Firebird las negritas para palabras reservadas?
[/Off Topic]
  • 0

#8 Marc

Marc

    Advanced Member

  • Moderadores
  • PipPipPip
  • 1.484 mensajes
  • LocationMallorca

Escrito 28 marzo 2011 - 12:15

Esa consulta es demasiado grande para estudiarla de golpe, vas a tener que probarla por partes.

Primero, pruebas lo mínimo, y después vas añadiendo campos, hasta localizar donde tienes el error :

Es decir, primero prueba :



sql
  1. SELECT
  2.   P.PAT_AGEN||'-'||P.NUM_PEDI AS PEDIME, P1.PAT_AGEN||'-'||P1.NUM_PEDI AS PEDREC
  3.  
  4. FROM SAAIO_PEDIME P
  5.   LEFT OUTER JOIN SAAIO_PEDIME P1 ON (P.NUM_REFEO = P1.NUM_REFE)
  6.   LEFT OUTER JOIN SAAIO_FACTUR A ON (A.NUM_REFE = P.NUM_REFE) AND (A.CONS_FACT = 1)
  7.   LEFT OUTER JOIN SAAIO_FACPAR F ON (F.NUM_REFE = P.NUM_REFE) AND (F.CONS_FACT = 1) AND (F.CONS_PART = 1)
  8.   LEFT OUTER JOIN SAAIO_CONTEN O ON (P.NUM_REFE = O.NUM_REFE)
  9.   LEFT OUTER JOIN SAAIO_TRANSP T ON (T.NUM_REFE = P.NUM_REFE)
  10.   LEFT OUTER JOIN CTRAC_TRANSP N ON(T.CVE_TRANSP = N.CVE_TRAN)
  11. WHERE P.FEC_PAGO IS NOT NULL
  12. 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 :



sql
  1. SELECT
  2.   P.PAT_AGEN||'-'||P.NUM_PEDI AS PEDIME, P1.PAT_AGEN||'-'||P1.NUM_PEDI AS PEDREC,
  3.   P.NUM_REFE, P.FEC_PAGO, P.IMP_EXPO, P.CVE_PEDI, P.TIP_CAMB, P.ADU_DESP, P.FAC_AJUS
  4.  
  5. FROM SAAIO_PEDIME P
  6.   LEFT OUTER JOIN SAAIO_PEDIME P1 ON (P.NUM_REFEO = P1.NUM_REFE)
  7.   LEFT OUTER JOIN SAAIO_FACTUR A ON (A.NUM_REFE = P.NUM_REFE) AND (A.CONS_FACT = 1)
  8.   LEFT OUTER JOIN SAAIO_FACPAR F ON (F.NUM_REFE = P.NUM_REFE) AND (F.CONS_FACT = 1) AND (F.CONS_PART = 1)
  9.   LEFT OUTER JOIN SAAIO_CONTEN O ON (P.NUM_REFE = O.NUM_REFE)
  10.   LEFT OUTER JOIN SAAIO_TRANSP T ON (T.NUM_REFE = P.NUM_REFE)
  11.   LEFT OUTER JOIN CTRAC_TRANSP N ON(T.CVE_TRANSP = N.CVE_TRAN)
  12. WHERE P.FEC_PAGO IS NOT NULL
  13. 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.
  • 0

#9 Marc

Marc

    Advanced Member

  • Moderadores
  • PipPipPip
  • 1.484 mensajes
  • LocationMallorca

Escrito 28 marzo 2011 - 12:19

Respecto a como dar formato a la Fecha.

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.



sql
  1. SET TERM ^ ;
  2.  
  3. CREATE PROCEDURE "spFECHA" (
  4.     VALOR TIMESTAMP)
  5. RETURNS (
  6.     FECHA VARCHAR(10))
  7. AS
  8. BEGIN
  9.   FECHA = SUBSTRING(CAST(EXTRACT(DAY FROM VALOR) + 100 AS VARCHAR(3)) FROM 2 FOR 2);
  10.   FECHA = FECHA || '/';
  11.   FECHA = FECHA || SUBSTRING(CAST(EXTRACT(MONTH FROM VALOR) + 100 AS VARCHAR(3)) FROM 2 FOR 2);
  12.   FECHA = FECHA || '/';
  13.   FECHA = FECHA || CAST(EXTRACT(YEAR FROM VALOR) AS VARCHAR(4));
  14.   suspend;
  15. END
  16. ^
  17.  
  18. 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) :



delphi
  1. select NUM_FACT, (select FECHA from "spFECHA"(FEC_FACT))
  2. from SAAIO_FACTUR



Así queda más bonito, ¿ verdad ?.
  • 0

#10 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.448 mensajes
  • LocationMéxico

Escrito 28 marzo 2011 - 12:21

Hola

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
  • 0

#11 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.448 mensajes
  • LocationMéxico

Escrito 28 marzo 2011 - 12:23

[Off Topic]
Una sugerencia de mosca cojonera  a 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
  • 0

#12 Fenareth

Fenareth

    Advanced Member

  • Administrador
  • 3.486 mensajes
  • LocationMexico City

Escrito 28 marzo 2011 - 12:36

Gracias Ego, funcionó muy bien haciendo la suma antes del extract  (y)
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 (b)

Gracias y Saludox !  :)
  • 0

#13 Rolphy Reyes

Rolphy Reyes

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.092 mensajes
  • LocationRepública Dominicana

Escrito 28 marzo 2011 - 08:42

Saludos.

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]
  • 0




IP.Board spam blocked by CleanTalk.