Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Firebird e Interbase (https://www.clubdelphi.com/foros/forumdisplay.php?f=19)
-   -   operaciones con fechas (https://www.clubdelphi.com/foros/showthread.php?t=64470)

GustavoCruz 02-04-2009 21:20:15

operaciones con fechas
 
hola nuevamente...:):):)

en delphi hay unas funciones que nos permiten hacer operaciones con las fechas, por ejemplo incmoth o incweek, etc. y me gustaría saber si exite en firebird alguna función que se asemeje a éstas.

nuevamente mil gracias


Gustavo Cruz

Delphius 03-04-2009 01:40:46

Hola GustavoCruz,
Desde Firebird 1.0 en Windows y 1.5 en Linux, existen las UDFs que buscas:

Código SQL [-]
AddDay(atimestamp, number)
AddHour(atimestamp, number)
AddMilliSecond(atimestamp, number)
AddMinute(atimestamp, number)
AddMonth(atimestamp, number)
AddSecond(atimestamp, number)
AddWeek(atimestamp, number)
AddYear(atimestamp, number)

Revisa el documento "Firebird Languaje Reference Update". Allí están documentadas. Si empleas Firebird 2.1 sería oportuno que revises el Release Notes para ver si algo ha cambiado, o si se ha añadido más.

Si deseas restar, en number debes pasar un valor negativo.

Saludos,

GustavoCruz 04-04-2009 23:56:22

Gracias delphius.

Ahora tengo otro interrogante, me gustaría saber cómo puedo hacer para que al momento de cambiar de mes siempre me quede en el último día del mismo, por ejemplo

31/01/2009
28/02/2009
31/03/2009
30/04/2009

Gracias nuevamente

Delphius 05-04-2009 02:10:18

Ummm.... ¿desde Firebird? La verdad es que allí ya me mataste:D:( Tendría que pensarlo, desconozco si hay alguna UDF que regrese la cantidad de días del mes...

Sería bueno que indicaras que versión de Firebird empleas. Al menos revisando la documentación que yo tengo de la 1.5 (es la que uso) no encuentro algo. Seguramente alguien más ilustrado nos puede iluminar;), ¿Jhonny estás allí:D?

Desde Delphi sería otra cosa, creo que en la unidad DateUtils hay ya una función que calcula lo que buscas... si no equivoco es DaysInAMonth.

De última, la creas. Te podrías basar en la función de Delphi.

Saludos,

Delphius 05-04-2009 02:55:02

Ahora que lo pienso... ¿y si en vez de sumarle n meses, le sumas n + 1 y le restas los m días que tengas?;)

Es decir que si por ejemplo, que hoy es 04/04 y deseamos que el plazo sea a Julio (31/07) en vez de sumarle n = 3, le sumamos n = 3 + 1 = 4:

Temporalmente nos queda: 04/08.

Le restamos los 4 días, y... finalmente tenemos 31/07.

En teoría funciona. No lo he probado...

EDITO:

Lo he probado, por ejemplo algo así:
Código SQL [-]
select cast(AddDay(AddMonth(CURRENT_DATE,4),-4) as TIMESTAMP) FROM TABLA1

Saludos,

Gallosuarez 05-04-2009 05:33:16

Gustavo:

Cuando empecé a programar en Firebird tuve la necesidad de hacer una funcion que si le mandada cualquier fecha dentro de los primeros quince dias del mes, esta me regresara todos los dias de la primera quincena de dicho mes. De la misma manera, si la fecha estaba dentro de la segunda quincena, me regrasaba todos los dias de la segunda quincena.
Asi fue como la hice:
Código SQL [-]
CREATE OR ALTER PROCEDURE DAYSOFMONTH(
    D DATE) /* Date */
RETURNS (
    DOM DATE) /* Day of Month */
AS
DECLARE VARIABLE I INTEGER;
DECLARE VARIABLE LD INTEGER; /* Last Day */
BEGIN
  I = 1;
  LD = EXTRACT(DAY FROM (D - EXTRACT(DAY FROM D) + 32 - EXTRACT(DAY FROM D - EXTRACT(DAY FROM D) + 32)));
  IF (EXTRACT(DAY FROM D) > 15) THEN
    I = 16;
  ELSE
    LD = 15;
  DOM = D - EXTRACT(DAY FROM D) + I;
  WHILE (I <= LD) DO
  BEGIN
    SUSPEND;
    DOM = DOM + 1;
    I = I + 1;
  END
END

No dejes de contarnos si te funcionó para lo que tú querias.

Saludos.

Gerardo Suárez

P.D. Por cierto, cada que me es posible evito los funciones externas (UDF's)

Delphius 05-04-2009 19:26:44

Cita:

Empezado por Gallosuarez (Mensaje 343941)

P.D. Por cierto, cada que me es posible evito los funciones externas (UDF's)

Disculpa que me entrometa pero me preguntaba si es posible que nos comentases más sobre esto... ¿porqué evitarse emplear UDFs?:confused:

Saludos,

GustavoCruz 06-04-2009 00:24:31

hola amigos, estaba pensando en hacer algo como los que plantea Gallosuarez, y me parece que para lo que necesito sólo debo utilizar la clausula EXTRACT, así que si hay un modo de "descomponer" la fecha, también debe haber un modo de "recomponer" fecha.

Ahora la cuestión es cuál es esa función, en delphi yo hago esto:
Código Delphi [-]
strtodate('30/'+formatdatetime('mm/yyyy'+fecha))

Nuevamente un millón de gracias


Gustavo Cruz

Gallosuarez 06-04-2009 05:35:24

Respuesta...
 
Delphius:

Respondiendo a tu pregunta (grosso-modo), la razón por la cual evito utilizar UDF's son basicamento dos:

1. Tengo un desarrollo de un sistema para escuelas, que solo lo instalaba en computadoras con Sistema Operativo Windows. Cuando tuve la necesidad de hacerlo en un sistema operativo Linux, hubo una funcion externa que solo funcionaba en Windows. Asi que mi sistema me enviaba un error muy extraño, despues de varios días de intensas pruebas (y dolores de cabeza), me di cuenta que lo que no estaba funcionando bien era una UDF's. (utilizando funciones internas esto no sucede jamás, y tu base de datos la puedes poner a funcionar en el S.O que tu decidas).

2. Estoy buscando la fuente (hace ya un rato que leí el documento), pero basicamente era uno de esos gurús en bases de datos que tenia problemas porque una UDF's le pegaba al desempeño del servidor (esto pasó cuando Borland no liberaba aun la licencia de Interbase). Este Sr. daba todo la explicación técnica (que ya no recuerdo bien como iba la cosa), en fin, a lo mejor algunos foristas avezados en estas lides nos puedan hechar mas luz sobre el asunto (en lo que yo encuentro el documento, si es que lo encuentro, claro está).

Por otro lado, respondiendo a Gustavo creo que lo que quiere ahora es lo siguiente:
Código SQL [-]

SELECT CAST('12/13/09' AS DATE)
FROM RDB$DATABASE

SELECT CAST('12/13/09 13:05:' AS TIMESTAMP)
FROM RDB$DATABASE

La "fecha cadena" debe de estar en el siguiente formato: 'mm/dd/yy'

Saludos,

GustavoCruz 06-04-2009 19:19:57

Amigo Gallosuarez, eso es exactamente lo que necesito...:)


Gracias por sus aportes...:):):)

Gustavo Cruz

Delphius 06-04-2009 19:54:52

Gracias Gallosuarez,
Respecto al punto 1, pues si... en parte hay una buena razón. Por otro lado para no encontrarse con esos problemas es que es recomendable leer la documentación que ofrece Firebird. Por ejemplo, en el caso de las funciones que yo mencioné están disponibles en Linux desde 1.5 pero en Windows desde la 1.0. Si hay algún error y ha sido reparado en el Release Notes se lo notifica.

Sobre el documento sería bueno leerlo. ¿No recuerdas más o menos el título del documento, a su autor o donde lo viste? En una de esas lo podemos hallar, si es que está disponible.

Saludos,

GustavoCruz 07-04-2009 22:26:28

Continuando con la operaciones con fechas, en delphi hay una función que devuelve el número de días que hay entre una fecha y otra,

en Firebird cuál es

Una vez más un millón de gracias...:)

jhonny 07-04-2009 22:52:35

Ey, solo hasta ahora vengo a ver que alguien invocó mi nombre por estos lares :D:D:D, gracias por lo que me toca Delphius :p.

Cita:

Empezado por GustavoCruz (Mensaje 344277)
Continuando con la operaciones con fechas, en delphi hay una función que devuelve el número de días que hay entre una fecha y otra,

en Firebird cuál es

Una vez más un millón de gracias...:)

Desde Firebird 2.1 en adelante existe una función (de fabrica) llamada DATEDIFF que te servirá para esto que necesitas... ;)

Sobre DATEDIFF coloco un pequeño ejemplo, en los comentarios de uno de los artículos (Funciones incorporadas en Firebird) colgados en mi blog...


La franja horaria es GMT +2. Ahora son las 08:14:12.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi