Consulta de disponibilidad

03/03/2005 - 21:11 por Javier Pérez | Informe spam
Hola chicos,

Tengo un problema con una consulta que no se muy bien como resolverlo. Os
cuento resumiento columnas

Actualmente tengo 2 tablas.

tblVehiculo

id, matricula
-
tblAlquilerVehiculo

id, idVehiculo, fechaSalida, fechaEntrada

cuando se realiza un alquiler aparecen filas en tblAlquilerVehiculo con el
id del alquiler (identidad) y la fecha en la que salió el coche (se alquilo)
con la fecha de entrada (cuando lo devolvió)

El problema se plantea cuando quiero calcular la disponibilidad para el dia
pej 3/3/05. Había pensado en pintar todos las filas que su fechaEntrada <=
3/3/05, es decir, aquellos alquileres que a día de la fecha ya lo hayan
devuelto. El problema es que también me aparecen los anteriores alquileres
de ese mismo vehiculo y solo me interesaría que apareciera el ultimo
alquiler para que funcione la disponibilidad.

Algun ayuda o sugerencia.?

Preguntas similare

Leer las respuestas

#6 Javier Pérez
03/03/2005 - 23:19 | Informe spam
Hola Alejandro y Gracias por tu tiempo,

Entiendo casi toda la consulta menos el último having y el <= @d del final.
El caso es que la consulta devuevle perfectamente los vehiculos nunca
alquilados pero no devuelve el último alquiler del coche no se my bien
porqué.

He montado la siguiente select:

select v.[id], v.[matricula]

from tblVehiculo as v

where

not exists

(select * from tblAlquilerVehiculo as a where a.[idVehiculo] = v.[id])

or

(select max(fechaEntrada) from tblAlquilerVehiculo as a

where a.[idVehiculo] = v.[id] and a.fechaSalida < '20050303'

group by a.[idVehiculo]

HAVING MAX(fechaEntrada) > MAX(fechaSalida)

)

<= '20050303'

Y me devuelto

id matricula


3 IB-4444-CT

4 4444-BJG

5 4444-BHW

6 4432-BBD

7 5676-BHW

8 3434-GGT

Teniendo...

id matricula


1 4444-BBD

2 4234-BBD

3 IB-4444-CT

4 4444-BJG

5 4444-BHW

6 4432-BBD

7 5676-BHW

8 3434-GGT



id idVehiculo fechaSalida fechaEntrada



23 1 2005-03-01 00:00:00.000 2005-03-07 00:00:00.000

24 2 2005-03-02 00:00:00.000 NULL



Debería devolverme también el idVehiculo2 ya que su fechaEntrada está a
NULL, y si está a null es como si fuera la misma que la de la salida ya que
significa que todavía no se ha confirmado la reserva. O crees que al
realizar la reserva es mejor poner ya la fecha de entrada siempre y que
nunca esté a null?





"Alejandro Mesa" escribió en el
mensaje news:...

Corrección,



declare @d datetime



set @d = '20050303'



select

v.[id],

v.[matricula]

from

tblVehiculo as v

where

not exists(select * from tblAlquilerVehiculo as a where a.[idVehiculo]
v.[id])

or

(

select

max(fechaEntrada)

from

tblAlquilerVehiculo as a

where

a.[idVehiculo] = v.[id]

and a.fechaSalida < @d

group by

a.[idVehiculo]

having

max(fechaEntrada) > max(fechaSalida)

) <= @d

go





La logica sigue la misma, pero habia usado tblAlquilerVehiculo.[id] en vez

de tblAlquilerVehiculo.idVehiculo.





AMB





"Alejandro Mesa" wrote:



> Javier,

>

> Ve si esto te sirve.

>

> set @d = '20050303'

>

> select

> v.[id],

> v.[matricula]

> from

> tblVehiculo as v

> where

> not exists(select * from tblAlquilerVehiculo as a where a.[id] = v.[id])

> or

> (

> select

> max(fechaEntrada)

> from

> tblAlquilerVehiculo as a

> where

> a.[id] = v.[id]

> and a.fechaSalida < @d

> group by

> a.[id]

> having

> max(fechaEntrada) > max(fechaSalida)

> ) <= @d;

>

> Selecciona el vehiculo que nunca haya salido o que su ultima
> fechaEntrada

> sea menor o igual que la fecha en question. Puedes incluir una hora

> especifica si quieres.

>

>

> AMB

>

>

>

> "Javier Pérez" wrote:

>

> > Hola chicos,

> >

> > Tengo un problema con una consulta que no se muy bien como resolverlo.
> > Os

> > cuento resumiento columnas

> >

> > Actualmente tengo 2 tablas.

> >

> > tblVehiculo

> >

> > id, matricula

> > -

> > tblAlquilerVehiculo

> >

> > id, idVehiculo, fechaSalida, fechaEntrada

> >

> > cuando se realiza un alquiler aparecen filas en tblAlquilerVehiculo
> > con el

> > id del alquiler (identidad) y la fecha en la que salió el coche (se
> > alquilo)

> > con la fecha de entrada (cuando lo devolvió)

> >

> > El problema se plantea cuando quiero calcular la disponibilidad para
> > el dia

> > pej 3/3/05. Había pensado en pintar todos las filas que su
> > fechaEntrada <
> > 3/3/05, es decir, aquellos alquileres que a día de la fecha ya lo
> > hayan

> > devuelto. El problema es que también me aparecen los anteriores
> > alquileres

> > de ese mismo vehiculo y solo me interesaría que apareciera el ultimo

> > alquiler para que funcione la disponibilidad.

> >

> > Algun ayuda o sugerencia.?

> >

> >

> >

> >

> >

> >

> >

> >

> >
Respuesta Responder a este mensaje
#7 Alejandro Mesa
04/03/2005 - 01:33 | Informe spam
Javier,

Ahora estoy confundido. Tu primer mensaje decia:

cuando se realiza un alquiler aparecen filas en tblAlquilerVehiculo con el
id del alquiler (identidad) y la fecha en la que salió el coche (se alquilo)
con la fecha de entrada (cuando lo devolvió)



por lo que no entiendo por que deberia estar el idVehiculo = 2 en el
resultado. Si el vehiculo 2 salio en 20050302 y tiene valor NULL en la
fechaEntrada, es porque aun no se ha devuelto. Si vas a consultar
disponibilidad para el dia 20050303 entonces el idVehiculo = 2, que aun no ha
sido entregado, no puede estar en el resultado.

Entiendo casi toda la consulta menos el último having y el <= @d del final.



La sentencia, como dije anteriormente, filtra la tabla tblVehiculo para
aquellos vehiculos que nunca han salido y para aquellos que salieron pero que
la ultima fecha de entrega es menor que la fecha para la que consultas
disponibilidad. La clausula HAVING asegura que esa ultima fecha de entrega no
este sucedida por otra fecha de salida cuya fecha de entrega es null. Te
pongo un ejemplo.

id matricula
10 ABCDEFG

id idVehiculo fechaSalida FechaEntrega
34 10 20050301 20050301
35 10 20050302 NULL

El vehiculo 10 salio el dia 20050301 y regreso el 20050301, pero volvio a
salir el 20050302 y no se ha devuelto. Si calculas la fecha de entrega maxima
menor al 20050303 te dara 20050301 y por tanto lo considerarias disponible,
pero en realidad salio al siguiente dia y aun no se ha devuelto. La clausula:

HAVING MAX(fechaEntrada) > MAX(fechaSalida)

asegura que el vehiculo no ha sido alquilado nuevamente desde su ultima
entrega. Conste que estoy usando MAYOR QUE porque me inmagino que debas estar
guardando la hora y minuto de la salida y la entrega, y como nadie alquila un
vehiculo y en el mismo momento lo entrega pues opte por el MAYOR QUE.
Podriamos usar MAYOR O IGUAL QUE para tener estos casos en cuenta. Aqui
tenemos otro caso.

id matricula
10 ABCDEFG

id idVehiculo fechaSalida FechaEntrega
34 10 20050301 20050301
35 10 20050302 20050302
36 10 20050303 20050303

El vehiculo 10 lo entregaron el 20050302 y volvio a salir el 20050303 y se
devolvio ese mismo dia (no se si estas usando timepo). Si calculas la ultima
fecha de entrega, te dara 20050303, la cual es igual al dia de consulta
20050303, por lo que se consideraria no disponible. Esto se filtra en:

(select max...) < @d

es decir, si entrego antes del dia para elcual consulto disponibilidad,
entonces el vehiculo esta disponible.

Cual es la MAX(fechaSalida)?

20050303

Cual es la MAX(fechaEntrega)?

20050302

Esto quiere decir que el carro se volvio a alquilar para esa fecha, por lo
que no deberia estar disponible.

Si este no es tu requerimiento, entonces no le prestes mucha atencion a esta
solucion. Creo que seria de mucha ayuda para nosotros que postees la
estructura de las tablas, unos datos de ejemplo y cual seria el resultado
esperado.


AMB

javier Pérez" wrote:

Hola Alejandro y Gracias por tu tiempo,

Entiendo casi toda la consulta menos el último having y el <= @d del final.
El caso es que la consulta devuevle perfectamente los vehiculos nunca
alquilados pero no devuelve el último alquiler del coche no se my bien
porqué.

He montado la siguiente select:

select v.[id], v.[matricula]

from tblVehiculo as v

where

not exists

(select * from tblAlquilerVehiculo as a where a.[idVehiculo] = v.[id])

or

(select max(fechaEntrada) from tblAlquilerVehiculo as a

where a.[idVehiculo] = v.[id] and a.fechaSalida < '20050303'

group by a.[idVehiculo]

HAVING MAX(fechaEntrada) > MAX(fechaSalida)

)

<= '20050303'

Y me devuelto

id matricula


3 IB-4444-CT

4 4444-BJG

5 4444-BHW

6 4432-BBD

7 5676-BHW

8 3434-GGT

Teniendo...

id matricula


1 4444-BBD

2 4234-BBD

3 IB-4444-CT

4 4444-BJG

5 4444-BHW

6 4432-BBD

7 5676-BHW

8 3434-GGT



id idVehiculo fechaSalida fechaEntrada



23 1 2005-03-01 00:00:00.000 2005-03-07 00:00:00.000

24 2 2005-03-02 00:00:00.000 NULL



Debería devolverme también el idVehiculo2 ya que su fechaEntrada está a
NULL, y si está a null es como si fuera la misma que la de la salida ya que
significa que todavía no se ha confirmado la reserva. O crees que al
realizar la reserva es mejor poner ya la fecha de entrada siempre y que
nunca esté a null?





"Alejandro Mesa" escribió en el
mensaje news:...

> Corrección,

>

> declare @d datetime

>

> set @d = '20050303'

>

> select

> v.[id],

> v.[matricula]

> from

> tblVehiculo as v

> where

> not exists(select * from tblAlquilerVehiculo as a where a.[idVehiculo] >
> v.[id])

> or

> (

> select

> max(fechaEntrada)

> from

> tblAlquilerVehiculo as a

> where

> a.[idVehiculo] = v.[id]

> and a.fechaSalida < @d

> group by

> a.[idVehiculo]

> having

> max(fechaEntrada) > max(fechaSalida)

> ) <= @d

> go

>

>

> La logica sigue la misma, pero habia usado tblAlquilerVehiculo.[id] en vez

> de tblAlquilerVehiculo.idVehiculo.

>

>

> AMB

>

>

> "Alejandro Mesa" wrote:

>

> > Javier,

> >

> > Ve si esto te sirve.

> >

> > set @d = '20050303'

> >

> > select

> > v.[id],

> > v.[matricula]

> > from

> > tblVehiculo as v

> > where

> > not exists(select * from tblAlquilerVehiculo as a where a.[id] = v.[id])

> > or

> > (

> > select

> > max(fechaEntrada)

> > from

> > tblAlquilerVehiculo as a

> > where

> > a.[id] = v.[id]

> > and a.fechaSalida < @d

> > group by

> > a.[id]

> > having

> > max(fechaEntrada) > max(fechaSalida)

> > ) <= @d;

> >

> > Selecciona el vehiculo que nunca haya salido o que su ultima
> > fechaEntrada

> > sea menor o igual que la fecha en question. Puedes incluir una hora

> > especifica si quieres.

> >

> >

> > AMB

> >

> >

> >

> > "Javier Pérez" wrote:

> >

> > > Hola chicos,

> > >

> > > Tengo un problema con una consulta que no se muy bien como resolverlo.
> > > Os

> > > cuento resumiento columnas

> > >

> > > Actualmente tengo 2 tablas.

> > >

> > > tblVehiculo

> > >

> > > id, matricula

> > > -

> > > tblAlquilerVehiculo

> > >

> > > id, idVehiculo, fechaSalida, fechaEntrada

> > >

> > > cuando se realiza un alquiler aparecen filas en tblAlquilerVehiculo
> > > con el

> > > id del alquiler (identidad) y la fecha en la que salió el coche (se
> > > alquilo)

> > > con la fecha de entrada (cuando lo devolvió)

> > >

> > > El problema se plantea cuando quiero calcular la disponibilidad para
> > > el dia

> > > pej 3/3/05. Había pensado en pintar todos las filas que su
> > > fechaEntrada <>
> > > 3/3/05, es decir, aquellos alquileres que a día de la fecha ya lo
> > > hayan

> > > devuelto. El problema es que también me aparecen los anteriores
> > > alquileres

> > > de ese mismo vehiculo y solo me interesaría que apareciera el ultimo

> > > alquiler para que funcione la disponibilidad.

> > >

> > > Algun ayuda o sugerencia.?

> > >

> > >

> > >

> > >

> > >

> > >

> > >

> > >

> > >



email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una pregunta AnteriorRespuesta Tengo una respuesta
Search Busqueda sugerida