disponibildiad de vehiculos

07/05/2005 - 12:50 por Javier Pérez | Informe spam
Hola a todos,

Tengo un problema con una disponibilidad de vehiculos con las siguientes
tablas

tblAlquilerVehiculo
(
[id] [int] IDENTITY (1, 1) NOT NULL ,
[fecha] [datetime] NOT NULL ,
[idVehiculo] [int] NOT NULL ,
[fechaSalida] [datetime] NOT NULL ,
[fechaEntrada] [datetime] NULL ,
[reserva] [bit] NOT NULL ,
)
[tblVehiculo
(
[id] [int] IDENTITY (1, 1) NOT NULL ,
[matricula] [varchar] (10) COLLATE Modern_Spanish_CI_AS NOT NULL ,
[modelo] [varchar] (50) COLLATE Modern_Spanish_CI_AS NOT NULL ,
)

En tblVehiculo aparecen todos los vehiculos que existen, y en
tblAlquilerVehiculo todos los alquileres que se han realizado.

Necesito saber dado una fechaDisponibilidad, todos los vehiculos que estén
disponibles para alquiler. Teniendo en cuenta los vehiculos cuya
fechaEntrada (cuando lo devuelven) tienes que ser menor o igual a la
fechaDisponibilidad, y resaltar que si un no tiene alquier (no ha salido
nunca) también debe aparecer.

Se me ha ocurrido hacer una select con not exist de la sigueinte manera...
pero no me está resultando correctamente.

select distinct veh.[id], veh.[matricula], veh.[modelo]

from tblVehiculo as veh,
tblAlquilerVehiculo as alq

where not exists
(
select *
from tblAlquilerVehiculo as alq
where alq.[idVehiculo] = veh.[id]
)
or
(
select max(fechaEntrada)
from tblAlquilerVehiculo as alq where
alq.[idVehiculo] = veh.[id]
and alq.fechaSalida < '07/05/2005'
group by alq.[idVehiculo]
having max(fechaEntrada) > max(fechaSalida)
) <= '07/05/2005'
and alq.[idVehiculo] = veh.[id]



Alguien que me pueda ayudar? muchas gracias por vuestro tiempo

- Javier Pérez
 

Leer las respuestas

#1 Eladio Rincón
07/05/2005 - 14:31 | Informe spam
mira a ver si este script reproduce tu escenario:

set nocount on
go
use tempdb
go
drop table dbo.Alquiler
go
drop table dbo.Vehiculos
go
create table dbo.Vehiculos (
[id] [int] IDENTITY (1, 1) primary key NOT NULL ,
[matricula] [varchar] (10)NOT NULL )
go
create table dbo.Alquiler (
[id] [int] IDENTITY (1, 1) primary key NOT NULL ,
[idVehiculo] [int] NOT NULL FOREIGN KEY REFERENCES Vehiculos(id),
[fechaSalida] [datetime] NOT NULL ,
[fechaEntrada] [datetime] NULL)
go
INSERT Vehiculos (matricula) select 'a-3323-cc'
INSERT Vehiculos (matricula) select 'a-3324-cc'
INSERT Vehiculos (matricula) select 'a-3325-cc'
INSERT Vehiculos (matricula) select 'a-3326-cc'
INSERT Vehiculos (matricula) select 'a-3327-cc'
go
insert alquiler (idvehiculo, fechaSalida) select 1, '20050101' -- en
alquiler
insert alquiler (idvehiculo, fechaSalida, fechaEntrada) select 2,
'20050101', '20050201' -- devuelto
insert alquiler (idvehiculo, fechaSalida, fechaEntrada) select 3,
'20050101', '20050601' -- con fecha de devolución para después de hoy
insert alquiler (idvehiculo, fechaSalida, fechaEntrada) select 4,
'20050601', '20050701' -- alquilado el mes de junio
go
SELECT distinct
v.*
FROM dbo.Vehiculos v
LEFT JOIN dbo.Alquiler a
ON v.id = a.idVehiculo
WHERE
a.idvehiculo IS NULL -- sin alquilar
OR ( a.fechaEntrada IS NULL) -- sin devolver
OR ( a.fechaSalida <= GETDATE() and a.fechaEntrada >= GETDATE()) --
alquilado
OR ( a.fechaSalida > GETDATE()) -- alquilado próximamente: disponible hoy




Eladio Rincón
SQL Server MVP

Solid Quality Learning (http://www.solidqualitylearning.com)
"Comparte lo que sabes, aprende lo que no sepas", FGG

Consulte el histórico del grupo en Google
http://groups.google.com/groups?gro....sqlserver

¿Te interesa participar en las reuniones
del grupo de Usuarios de SQL-Server y .NET
Se harán en levante de España, (Alicante o Murcia)?

"Javier Pérez" wrote in message
news:
Hola a todos,

Tengo un problema con una disponibilidad de vehiculos con las siguientes
tablas

tblAlquilerVehiculo
(
[id] [int] IDENTITY (1, 1) NOT NULL ,
[fecha] [datetime] NOT NULL ,
[idVehiculo] [int] NOT NULL ,
[fechaSalida] [datetime] NOT NULL ,
[fechaEntrada] [datetime] NULL ,
[reserva] [bit] NOT NULL ,
)
[tblVehiculo
(
[id] [int] IDENTITY (1, 1) NOT NULL ,
[matricula] [varchar] (10) COLLATE Modern_Spanish_CI_AS NOT NULL ,
[modelo] [varchar] (50) COLLATE Modern_Spanish_CI_AS NOT NULL ,
)

En tblVehiculo aparecen todos los vehiculos que existen, y en
tblAlquilerVehiculo todos los alquileres que se han realizado.

Necesito saber dado una fechaDisponibilidad, todos los vehiculos que estén
disponibles para alquiler. Teniendo en cuenta los vehiculos cuya
fechaEntrada (cuando lo devuelven) tienes que ser menor o igual a la
fechaDisponibilidad, y resaltar que si un no tiene alquier (no ha salido
nunca) también debe aparecer.

Se me ha ocurrido hacer una select con not exist de la sigueinte manera...
pero no me está resultando correctamente.

select distinct veh.[id], veh.[matricula], veh.[modelo]

from tblVehiculo as veh,
tblAlquilerVehiculo as alq

where not exists
(
select *
from tblAlquilerVehiculo as alq
where alq.[idVehiculo] = veh.[id]
)
or
(
select max(fechaEntrada)
from tblAlquilerVehiculo as alq where
alq.[idVehiculo] = veh.[id]
and alq.fechaSalida < '07/05/2005'
group by alq.[idVehiculo]
having max(fechaEntrada) > max(fechaSalida)
) <= '07/05/2005'
and alq.[idVehiculo] = veh.[id]



Alguien que me pueda ayudar? muchas gracias por vuestro tiempo

- Javier Pérez


Preguntas similares