webForumDet fria alternativet

Krånglig fråga med klockslag!

Databaser & SQL

131 svar · 4 126 visningar · startad av oskars · sida 3 av 7

Frågan, av oskars

Hej! 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: Min tabell: Startdatum;Starttid;Slutdatum;Sluttid 20080725;1415;20080725;1425 20080725;1420;20080725;1435 20080725;1325;20080725;1425 20080725;1505;20080725;1550 20080725;2205;20080725;2230 20080725;2145;20080725;221

Läs frågan i sin helhet →
Medlem sedan nov. 20051 317 inlägg
#41

Hm... har skapat modulen som addTime nu, men den verkar ändå inte fungera.

Högst upp i koden:

Option Compare Database

Och sen följer koden som jag skrev i inlägget tidigare efter det här...

Får ändå [Microsoft][ODBC Microsoft Access Driver] Undefined function 'addTime' in expression. Tycker att jag gjort allt rätt!

Jag kör Access 2007 eller vad det nu heter :D

Medlem sedan dec. 20025 483 inlägg
#42

Efter lite sökning på nätet verkar det inte som att det går att använda sig egendefinierade funktioner genom t.ex. ASP. Se exempelvis http://www.ureader.com/message/1376557.aspx.

Direkt i Access fungerar det däremot.

Medlem sedan nov. 20051 317 inlägg
#43

Okej, men dåså, då går det inte. Jag kör ju genom ASP... :) Vet inte hur man använder Access för rapporter, tyvärr!

Tack som fan för hjälpen iaf!

Medlem sedan nov. 20051 317 inlägg
#44

Hm... det måste vara fel någonstans...

Med följande fråga kan jag få ett resultat typ över 30st:

		RecSet.Open "SELECT Startdatum, 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 resor WHERE Weekday(Startdatum) = "&Request.Form("veckodag")&" AND NOT K1 = '06' AND NOT (K1 = '04' AND InStr(AC,'-')) GROUP BY Startdatum", Connect, 3, 3

Jag bifogar en bild som illustrerar hur frågan ska tänka. På bilden är 1st "resa" respresenterad av ett svart streck... det är alltså typ en tidslinje mellan t.ex 2200 och 2300 du ser på bilden. Maximalt är det 5st som pågår samtidigt då.

Har vi gjort fel i frågan någonstans?

Får fel resultat, och det börjar brinna i knutarna :O

Grejen är att det totalt bara kan finnas 16st "resor" som går samtidigt...

T.ex så får jag fram 2008-08-01 7st mellan "1200 - 1300" med denna frågan:

Set RecSet = Server.CreateObject("ADODB.Recordset")
RecSet.Open "SELECT SUM(iif((Starttid > '"&Starttid&"' and Starttid < '"&Sluttid&"') OR (add_Sluttid > '"&Starttid&"' and add_Sluttid < '"&Sluttid&"') " & _
			"OR (Starttid < '"&Starttid&"' and Starttid < '"&Sluttid&"' and Startdatum < Slutdatum) OR (add_Sluttid > '"&Starttid&"' and add_Sluttid > '"&Sluttid&"' and Startdatum < Slutdatum),1,0)) " & _
				"AS Tal FROM resor WHERE Startdatum = #"&minDag("Startdatum")&"# AND NOT K1 = '06' AND NOT (K1 = '04' AND InStr(AC,'-'))", Connect, 3, 3

Sanningen är att det finns totalt 7st resor under denna tiden, MEN dom överlappar inte varandra.

Kolla bilden på datan i databasen jag bifogat. Där ser jag, om jag räknar rätt i min trötthet, att det verkar va maximalt 3st samtidigt. Dessa överlappar varandra:

3st:
12:38 - 12:43
12:41 - 12:47
12:44 - 12:49

2st:
12:51 - 12:56
12:52 - 13:08

Det är den maximala siffran, alltså "3st" som jag vill få ut :)

Får inte ordning på det själv :( Behöver vara färdig tills imorgon också. Blä blä blä!

resor.GIFmerresor.JPG
Medlem sedan nov. 20051 317 inlägg
#45

*se ovan* :)

Medlem sedan nov. 20051 317 inlägg
#46

Jag fattar typ hur man räknar ut huruvida t.ex dessa två resor överlappar varandra:

Resa 1. 15:06 - 15:30
Resa 2. 14:50 - 15:20

Men inte hur man automatiserar det i en SQL-fråga. Den frågan du gjort Peter fungerar säkert, men det är ändå något som är knas. Hoppas någon kan hjälpa mig!

Medlem sedan dec. 20025 483 inlägg
#47

Då skall vi se:

select max(dt.c)
  from ( select ( select count(*)+1 
                    from resor 
                   where ((starttid > d.starttid and starttid < d.sluttid)
                      or (sluttid > d.starttid and ((sluttid < d.sluttid and slutdatum = d.startdatum)
                      or (sluttid > d.sluttid and slutdatum < d.slutdatum))))
                     and startdatum = d.startdatum
                     and K1 = '06'
                     and not (K1 = '04' AND InStr(AC,'-'))) as c
           from resor d
          where d.startdatum = 20080801
            and K1 = '06'
            and not (K1 = '04' AND InStr(AC,'-'))) dt
Medlem sedan nov. 20051 317 inlägg
#48

Nu blir jag nervös!!!

Måste testa direkt!!!!!!

Tack!!!! Återkommer när testet är gjort!

Medlem sedan nov. 20051 317 inlägg
#49

Det ska ju vara mellan utvalda klockslag också :q Kan man lägga till det?

EDIT: Och datumet är i formatet ÅÅÅÅ-MM-DD... Men det är väl bara att ändra i where d.Startdatum = 20080801

Medlem sedan dec. 20025 483 inlägg
#50

Ja, just det ;) Typ så här då:

select max(dt.c)
  from ( select ( select count(*)+1 
                    from resor 
                   where ((starttid > d.starttid and starttid < d.sluttid)
                      or (sluttid > d.starttid and ((sluttid < d.sluttid and slutdatum = d.startdatum)
                      or (sluttid > d.sluttid and slutdatum < d.slutdatum))))
                     and startdatum = d.startdatum
                     and K1 = '06'
                     and not (K1 = '04' AND InStr(AC,'-'))) as c
           from resor d
          where d.startdatum = #2008-08-01#
            and starttid > 1200
            and sluttid < 1300
            and K1 = '06'
            and not (K1 = '04' AND InStr(AC,'-'))) dt
Medlem sedan nov. 20051 317 inlägg
#51

Jag får följande meddelande av följande fråga:

			Set RecSet = Server.CreateObject("ADODB.Recordset")
			RecSet.Open "select max(dt.c) from ( select ( select count(*)+1 from resor where ((Starttid > d.Starttid and Starttid < d.Sluttid) or (Sluttid > d.Starttid and ((Sluttid < d.Sluttid and Slutdatum = d.Startdatum) or (Sluttid > d.Sluttid and Slutdatum < d.Slutdatum)))) and Startdatum = d.Startdatum and K1 = '06' and not (K1 = '04' AND InStr(AC,'-'))) AS c FROM resor d where Weekday(d.Startdatum) = "&Request.Form("veckodag")&" and K1 = '06' and not (K1 = '04' AND InStr(AC,'-'))) dt", Connect, 3, 3

ADODB.Recordset error '800a0cc1'
Item cannot be found in the collection corresponding to the requested name or ordinal.

/test.asp, line 182

Medlem sedan dec. 20025 483 inlägg
#52

Sedan returnerar inte InStr() true eller false, utan en siffra: om '-' skall finnas i AC bör du skriva InStr() > 0, annars InStr() = 0.

Medlem sedan dec. 20025 483 inlägg
#53

Finns Request.Form("veckodag")? Annars, vad får du om du skriver ut SQL:en?

Medlem sedan nov. 20051 317 inlägg
#54

("veckodag") finns och visar korrekt data (alltså 1-7)...

Ska visa dig den utskrivna SQLen strax efter mina ny tester...

Du är min hjälte!

Medlem sedan dec. 20025 483 inlägg
#55

Du får förmodligen felet när du skriver ut med RecSet("..."). Använd antingen RecSet(0) eller:

select max(dt.c) as foo from...

RecSet("foo")
Medlem sedan nov. 20051 317 inlägg
#56

Utskriven:

SELECT max(dt.c) FROM ( SELECT ( SELECT COUNT(*)+1 FROM allingsas WHERE ((Starttid > d.Starttid AND Starttid < d.Sluttid) OR (Sluttid > d.Starttid AND ((Sluttid < d.Sluttid AND Slutdatum = d.Startdatum) OR (Sluttid > d.Sluttid AND Slutdatum < d.Slutdatum)))) AND Startdatum = d.Startdatum AND K1 = '06' AND NOT (K1 = '04' AND InStr(AC,'-') > 0)) as c FROM allingsas d WHERE Weekday(d.startdatum) = 2 AND Starttid > '1000' AND Sluttid < '1100' AND K1 = '06' AND NOT (K1 = '04' AND InStr(AC,'-') > 0)) dt

nu har jag istället problem med att skriv ut resultatet. Den säger att "Item cannot be found in the collection corresponding to the requested name or ordinal." när jag försöker skriva ut RecSet("c")... för det är väl "AS c"?
EDIT: Jag såg ditt tidigare inlägg nu. Tack!

Måste bara fråga... kommer den frågan returnera alla t.ex Måndagar (om man väljer det), så här:

Måndagar, mellan 1100 och 1200:

2008-01-07: 3st
2008-01-14: 2st
2008-01-21: 4st
osv...

EDIT: Jag darrar, tänk om vi får det att funka!

Medlem sedan dec. 20025 483 inlägg
#57

Japp :)

Medlem sedan nov. 20051 317 inlägg
#58

Jo. Nu räknar den ett tal åt mig... Får fram "18" när jag söker 1000 - 1100 på Måndagar... Antar att den sammanfattar över hela tabellen typ?

Jag får med andra ord fram enbart ett tal.. inget datum som talet gäller...

Går det att sammanfatta det så som jag skrev i inlägget över detta? Ska jag kanske bara göra en SELECT DISTINCT Startdatum WHERE Weekday(Startdatum) = "&Veckodag&" typ? Och sen lägga din nya fråga innanför den loopen och köra WHERE Startdatum = RecSet("Startdatum") typ?

Medlem sedan dec. 20025 483 inlägg
#59

Jag måste revidera mitt inlägg ovan litet :) Nej, den listar inte alla måndagar. Men nedanstående gör det:

SELECT max(dt.c) 
  FROM ( SELECT ( SELECT COUNT(*)+1 
                    FROM allingsas 
                   WHERE ((Starttid > d.Starttid AND Starttid < d.Sluttid) 
                      OR (Sluttid > d.Starttid AND ((Sluttid < d.Sluttid AND Slutdatum = d.Startdatum) 
                      OR (Sluttid > d.Sluttid AND Slutdatum < d.Slutdatum)))) 
                     AND Weekday(Startdatum) = 2
                     AND K1 = '06' 
                     AND NOT (K1 = '04' AND InStr(AC,'-') > 0)) as c 
           FROM allingsas d 
          WHERE Weekday(d.startdatum) = 2 
            AND Starttid > '1000' 
            AND Sluttid < '1100' 
            AND K1 = '06' 
            AND NOT (K1 = '04' AND InStr(AC,'-') > 0)) dt
Medlem sedan dec. 20025 483 inlägg
#60

Om även datum skall plockas ut:

SELECT d.startdatum
     , ( SELECT COUNT(*)+1 
           FROM allingsas 
          WHERE ((Starttid > d.Starttid AND Starttid < d.Sluttid) 
             OR (Sluttid > d.Starttid AND ((Sluttid < d.Sluttid AND Slutdatum = d.Startdatum) 
             OR (Sluttid > d.Sluttid AND Slutdatum < d.Slutdatum)))) 
            AND Weekday(Startdatum) = 2
            AND K1 = '06' 
            AND NOT (K1 = '04' AND InStr(AC,'-') > 0)) as c 
  FROM allingsas d 
 WHERE Weekday(d.startdatum) = 2 
   AND Starttid > '1000' 
   AND Sluttid < '1100' 
   AND K1 = '06' 
   AND NOT (K1 = '04' AND InStr(AC,'-') > 0)) dt
260 ms totalt · 4 externa anrop · v20260731065814-full.6fe65c25
116 ms — deklarationer (db)
0 ms — hämta statistik (cache)
137 ms — hämta tråd, inlägg och bilagor (db)
121 ms — ändringar (db)