Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   SQL (https://www.clubdelphi.com/foros/forumdisplay.php?f=6)
-   -   Crear Calendario con SQL (https://www.clubdelphi.com/foros/showthread.php?t=71127)

gcaffe 02-12-2010 00:11:36

Crear Calendario con SQL
 
Hola a todos:
A traves de una consulta SQL necesito crear un listado en memoria con los día que hay entre dos fechas. El entorno es el siguiente:
1. En una tabla existen dos campos FInicial y FFinal, por ejemplo 01/05/2011 y 25/08/2011, esta fecha pueden ser de cualquier rango pero siempre FInicio<=FFinal.
2. Quiero que con una sola instruccion SELECT de ese rango de fechas me presente una tabla que tenga un dia por cada registro ejem:
20110501
20110502
20110503
...
20110825

Desde allí ya puedo armar un calendario.

Lo primero que se me ocurrió fue hacerlo con un cursor, lo cual es sencillo, pero la aplicación lo requiere como un consulta. He realizado algunas pruebas, algo asi como
Código SQL [-]
SELECT FInicio, FInicio+RowCount FROM Tabla
WHERE FInicio+RowCount<=FFinal
pero solo obtengo 1 fila. Necesito algo que reemplace a RowCount para que vaya sumando una unidad.

Me temo que es dificil pero no pierdo la esperanza.

Gracias anticipadas.

ElKurgan 02-12-2010 08:01:05

Vendría bien que nos dijeras en que base de datos lo estás haciendo.

Si se trata de oracle, puedes sacar todos los días entre fechas con este código:

SELECT TRUNC(SYSDATE,'y') - 1 + ROWNUM dt FROM all_objects
WHERE (TRUNC(SYSDATE,'y') - 1 + ROWNUM) BETWEEN :Fechad AND :FechaH


Espero que, como base, te pueda ayudar un poco

fjcg02 02-12-2010 09:37:20

Hola,
en una query no sé, pero es bastante usual incluir una tabla de fechas con un registro por día.

Generalmente, se usan los campos
Fecha
Año
Mes ( nº y caracter )
Trimestre ( nº y caracter )
Semestre ( nº y caracter )
Dia semana ( nº y caracter )

Con un procedimiento que añada un año completo.

Luego, con esta tabla, además de poder hacer lo que quieres ( cruzando tu tabla con ésta ), puedes sacar estadísticas por todos los campos que están incluidos.

Espero que te sirva.

Saludos

gcaffe 02-12-2010 11:02:50

Hola ElKurgan:
Yo uso MS SQL 2005, de todas formas probaré como podría adaptar el ejemplo que me envías, y si ya sabes como resolverlo con MSSQL, te agradecería me lo dijeras.

Un saludo

gcaffe 02-12-2010 11:09:06

Hola fjcg02:

La solución de la tabla ya la tengo implantada, lo que realmente quiero es crear un calendario de 3 meses en tiempo de ejecución y que temporalmente este en memoria, dependiendo de la consulta que realice el usuario.

Gracias por tu respuesta

fjcg02 02-12-2010 11:52:53

Entonces es más fácil.

Sólo tienes que hacer una función que cargue un clientdataset con los días entre el intervalo.
Para esos menesteres es lo mejor porque puedes aprovecharte de toda la potencia de los mismos ( funciones Addrecord, deleterecord, locate, ...).
Tienes información de este tema específico en delphi al limite.

Un saludo

kikin911 13-12-2012 20:00:48

Crear Calendario
 
Crear un tabla tbl_fecha con campos fecha y feriado

Y luego correr esta query :

declare @fecIni datetime
declare @fecFin datetime


SELECT @fecIni = '01/02/2013'
SELECT @fecFin = '31/12/2013'


WHILE @fecIni <= @fecFin
BEGIN

INSERT INTO tbl_fecha (fecha, feriado) VALUES (@fecIni ,'N')

---SELECT FECHA = @fecIni
SET @fecIni = dateadd(d, 1, @fecIni);

END;

Casimiro Notevi 13-12-2012 23:12:27

Bienvenido a clubdelphi, ¿ya leiste nuestra guía de estilo?, gracias por tu colaboración :)


Recuerda poner los tags al código fuente, ejemplo:



Gracias :)

olbeup 14-12-2012 08:38:22

Hola gcaffe

Lo que ha puesto el compañero kikin911 es correcto, lo que yo añado es la tabla en memoria.
Código SQL [-]
DECLARE
  @fIni   smalldatetime
  ,@fFin  smalldatetime
  ,@d     tinyint

DEClARE
  @MyCalendario  TABLE (FECHA smalldatetime)

SET @fIni = '01/05/2011'
SET @fFin = '25/05/2011'
SET @d    = 0

WHILE @fIni <= @fFin
BEGIN
  INSERT INTO @MyCalendario VALUES (@fIni)
  SET @fIni = DATEADD(d, 1, @fIni)
END

SELECT
    FECHA
  FROM @MyCalendario

Un saludo.


La franja horaria es GMT +2. Ahora son las 23:21:39.

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