C# + SQL - felaktig logik, men var? :(

Permalänk
Medlem

C# + SQL - felaktig logik, men var? :(

Hej!

Håller på att koda ett rumsbokningssystem i C#. I botten kör jag en SQL server 2005 databas. Bokningen fungerar så att man väljer vilken tid man vill boka och sedan skall en lista över lediga rum vid just det valda tidsintervallet komma upp. Där skall man sedan välja rum, och bekräfta.
Mitt problem är att när jag skall generera listan av lediga rum så vill jag bara ha lediga i det tidsspannet för att undvika dubbelbokningar. DEtta hade jag tänkt lösa med SQL, men jag får inte riktigt till det. Databasen har 2 tabeller. En med rum och en med bokningar. De är sammankopplade med rumsID.
Nedan är min sql syntax: (start och stop tid är i shortdatetime format, 2008-10-10 14:30:00 t.ex.)
EDIT: startTime och stopTime är strängar som jag sätter samman från datetimepicker samt fält där jag anger tid.

select rooms.name from rooms, bookings where rooms.id!=bookings.rooms_id AND '"+startTime+"' NOT BETWEEN bookings.start AND bookings.stop OR '"+stopTime+"' NOT BETWEEN bookings.start AND bookings.stop;

Någon som kan se var min logik sviker mig?

Permalänk
Medlem

Tycker väl det borde fungera, har du kollat att det funkar med det formatet på din startTime och stopTime?

Prova sätta parenteser om villkoren så att inte SQL Server tror att bookings.start är ett intervall... har du testat att köra utan WHERE rooms.id != bookings.rooms_id ?

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av azoapes
Tycker väl det borde fungera, har du kollat att det funkar med det formatet på din startTime och stopTime?

Prova sätta parenteser om villkoren så att inte SQL Server tror att bookings.start är ett intervall... har du testat att köra utan WHERE rooms.id != bookings.rooms_id ?

Nej inte testat att köra utan rooms.id!=boo.... men tycker det behövs väl? Men kanske kan funka ändå? Tycker nämligen att då väljer man väl inte ut att de som inte är bokade då skall visas, utan tar alla? Gah får inte rätt på det i huvudet. Men skall testa med paranteserna!

Permalänk
Medlem

Personligen så tycker jag att rooms.id!=boo... ser lite suspekt ut. Vad får du för resultat kanske man borde fråga?

Nu när du testat med paranteser, får du fortfarande fel? Du bör inte ha några problem att få ut alla rum som är bokade så det går att arbeta med det om du inte är allergisk mot subqueries
Då blir det ungefär: Select name from rooms where name not in(select rooms.name from... );

/Peo

Permalänk
Medlem

Använd <>, inte !=

Edit: Fast den senare kanske faktiskt finns, när jag tänker efter. Får du felmeddelanden (som du inte delar med dig av), eller är det bara så att frågan inte gör som du vill?

Edit igen: Något med rooms.id NOT IN (Select room_id from bookings) ... ?

Visa signatur

The power of GNU compiles you!
"Often statistics are used as a drunken man uses lampposts -- for support rather than illumination."

Permalänk
Medlem

något i stil med

select r.name
from rooms r
inner join bookings b on r.id = b.rooms_id
where r.id not in (select rooms_id from bookings where start > ('"+stopTime+"' or stop < '"+startTime+"'))

borde väl fungera annars?

Visa signatur

mm, just de!

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av Peo_Bond
Personligen så tycker jag att rooms.id!=boo... ser lite suspekt ut. Vad får du för resultat kanske man borde fråga?

Nu när du testat med paranteser, får du fortfarande fel? Du bör inte ha några problem att få ut alla rum som är bokade så det går att arbeta med det om du inte är allergisk mot subqueries
Då blir det ungefär: Select name from rooms where name not in(select rooms.name from... );

/Peo

Ah tack mannen!
Gjort en sats med många subs...men nu funkar det iaf

Hatten av för tipset!

nedan är slutversionen implmenterad i c#:

String sql = "SELECT DISTINCT id, name, projector FROM rooms " + "WHERE id NOT IN " + "(SELECT room_id FROM bookings AS bookings_1 WHERE (start_date > '" + startDate + "') AND (start_date < '" + stopDate + "'))" + " AND id NOT IN " + "(SELECT room_id FROM bookings AS bookings_1 WHERE (stop_date > '" + startDate + "') AND (stop_date < '" + stopDate + "'))" + " AND id NOT IN " + "(SELECT room_id FROM bookings AS bookings_1 WHERE (stop_date > '" + stopDate + "') AND (start_date < '" + startDate + "'))";