Nu sitter jag här. Återigen. Jävla SQL. Jag vet inte hur jag ska tänka. Så fort frågan blir komplicerad så fastnar jag. Jag ska försöka sammanfatta mitt problem:
Det jag vill få ut ur databasen är hur många klockslag som överlappar varandra totalt, under valda klockslag.
Så här:
Mellan 14:00 - 14:30 = 3st
Mellan 22:00 - 22:30 = 2st
14:00-14:30 och 14:30-15:00 överlappar Inte varandra :)
Hoppas ni förstår vad jag menar!
Det går säkert att lösa på logiskt vis. Jag har försökt med BETWEEN osv... men den ska ju räkna tider som överlappar varandra under två utvalda klockslag. Då funkar det inte med enbart BETWEEN.
Det kan med andra ord finnas rader som går över flera dagar? Har datumet ingen betydelse, d.v.s. om indatat är "14:00" och "14:30" så skall både 20080724;1405;20080724;2300 och 20080727;1420;20080727;1700 räknas?
Jo, vissa rader går över 1st dag.. alltså 23-01 t.ex.. .aldrig mer
Det är bara från 1st datum som resutlatet ska hämtas... Men en rad kan ju börja på 23 och sluta 01... och om man ställer en fråga typ mellan 23:00 och 00:30 så ska den följa med. :)
select sum(case when (starttid > <tid1> and starttid < <tid2>)
or (sluttid > <tid1> and sluttid < <tid2>)
or (starttid < <tid1> and starttid < <tid2> and startdatum < slutdatum)
or (sluttid > <tid1> and sluttid > <tid2> and startdatum < slutdatum)
then 1 else 0 end)
from t
...där <tid1> = den första in-tiden och <tid2> = den andra in-tiden. Starttid, sluttid, startdatum och slutdatum är kolumnnamnen och t är tabellnamnet. Ovanstående syntax fungerar i åtminstone MySQL och MSSQL.
Med reservation för eventuella blackouter som kan ha inträffat :)
Glömde såklart att nämna att det är Access som gäller! Kan säkert byta till MySQL om det skulle vara så. Men ska testa och se om den funkar i Access :)
select sum(iif((starttid > <tid1> and starttid < <tid2>)
or (sluttid > <tid1> and sluttid < <tid2>)
or (starttid < <tid1> and starttid < <tid2> and startdatum < slutdatum)
or (sluttid > <tid1> and sluttid > <tid2> and startdatum < slutdatum),
1,0))
from t
<%
Set Connect = Server.CreateObject("ADODB.Connection")
Connect.Open "Driver={Microsoft Access Driver (*.mdb)}; DBQ=" & Server.MapPath("db.mdb")
Starttid = 1400
Sluttid = 1500
Set RecSet = Server.CreateObject("ADODB.Recordset")
RecSet.Open "SELECT SUM(iif((starttid > "&Starttid&" and starttid < "&Sluttid&") OR (sluttid > "&Starttid&" and sluttid < "&Sluttid&") " & _
"OR (starttid < "&Starttid&" and starttid < "&Sluttid&" and startdatum < slutdatum) OR (sluttid > "&Starttid&" and sluttid > "&Sluttid&" and startdatum < slutdatum),1,0)) " & _
" AS tal FROM kontant WHERE NOT K1 = 6", Connect, 3, 3
Color = "EEE"
Do Until RecSet.EOF
Response.Write RecSet("tal")
RecSet.MoveNext
Loop
%>
Microsoft OLE DB Provider for ODBC Drivers error '80040e10'
[Microsoft][ODBC Microsoft Access Driver] Too few parameters. Expected 2.
test.asp, line 19
response.write "SELECT SUM(iif((starttid > "&Starttid&" and starttid < "&Sluttid&") OR (sluttid > "&Starttid&" and sluttid < "&Sluttid&") " & _
"OR (starttid < "&Starttid&" and starttid < "&Sluttid&" and startdatum < slutdatum) OR (sluttid > "&Starttid&" and sluttid > "&Sluttid&" and startdatum < slutdatum),1,0)) " & _
" AS tal FROM kontant WHERE NOT K1 = 6"
NU fick jag det att fungera! Men vart väljs datumet? Är det bara att lägga till WHERE Startdatum = 20080725? Hittar den även tider som går över tilll 01:00 20080726?
EDIT:
Jag vill alltså ställa frågan:
Den 25 Februari mellan 14:00 och 14:30... hur många tider överlappade varandra då?
Microsoft OLE DB Provider for ODBC Drivers error '80040e14'
[Microsoft][ODBC Microsoft Access Driver] You tried to execute a query that does not include the specified expression 'Startdatum' as part of an aggregate function.
Jo nu fungerade det :) Såna här frågor är out of my league :) Men till slut går det med lite hjälp!
Hur kan jag nu utveckla frågan så att jag t.ex vill välja att enbart göra den här sökning på enbart där Weekday(Startdatum) = 6? Ska testa lite själv, men du får gärna ge lite tips!
Microsoft OLE DB Provider for ODBC Drivers error '80040e14'
[Microsoft][ODBC Microsoft Access Driver] Undefined function 'FormatDateTime' in expression.
/taxi/test.asp, line 19