webForumDet fria alternativet

Krånglig fråga med klockslag!

Databaser & SQL

131 svar · 4 126 visningar · startad av oskars

Medlem sedan nov. 20051 317 inlägg
Frågan#1

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;2210
20080725;2235;20080725;2300

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.

Eller tänker jag fel?

Mvh
Oskar

Medlem sedan dec. 20025 483 inlägg
#2

- Hur sparas värdena, är det strängar?
- Kan indatat alltså vara t.ex. "14:00" och "14:30" som i "hur många tider finns inom 14:00 och 14:30"?

Medlem sedan nov. 20051 317 inlägg
#3

Tiderna sparas som "1433"... som tal. Samma sak med datumen 20070825.

Ja precis:

"Hur många tider överlappar varandra mellan "1400" och "1430".

Hur gör man om det är tider mellan 2300 och 0100?

Tack för att du tar dig tid!!

Medlem sedan dec. 20025 483 inlägg
#4

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?

Medlem sedan nov. 20051 317 inlägg
#5

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. :)

Medlem sedan dec. 20025 483 inlägg
#6
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 :)

Medlem sedan nov. 20051 317 inlägg
#7

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 :)

Tack! Ska testa så snart jag hinner!

Medlem sedan dec. 20025 483 inlägg
#8

Det fungerar inte i Access. Testa i stället:

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
Medlem sedan nov. 20051 317 inlägg
#9

Jag testar, men får det inte att fungera:

<%	
	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
Medlem sedan dec. 20025 483 inlägg
#10

Vad får du med

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"
Medlem sedan nov. 20051 317 inlägg
#11

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å?

Medlem sedan dec. 20025 483 inlägg
#12

Japp!

Medlem sedan nov. 20051 317 inlägg
#13

Fast det funkar ju inte, eftersom "startdatum" inte är med i SELECTen... Fick det inte att funka med SELECT startdatum, SUM....) heller...

Medlem sedan dec. 20025 483 inlägg
#14

Varför fungerar inte det?

Medlem sedan nov. 20051 317 inlägg
#15

:)

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.

/taxi/test.asp, line 19

Medlem sedan dec. 20025 483 inlägg
#16

Om du bara har med startdatum i WHERE och inte i SELECT?

Medlem sedan nov. 20051 317 inlägg
#17

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!

Medlem sedan dec. 20025 483 inlägg
#18

Lägg till villkor i WHERE:

...where weekday(...) = 6 and X <> Y...
Medlem sedan nov. 20051 317 inlägg
#19

Jo, jag testade det, men eftersom datumet står så här: 20080725 så måste jag formatera det på något sätt.

Så jag testade det här:

weekday(FormatDateTime(Left(Startdatum,4) &""-""& Left(Right(Startdatum,4),2) &""-""& Right(Startdatum,2),2)) = 6

Vilket gav mig:

Microsoft OLE DB Provider for ODBC Drivers error '80040e14' 

[Microsoft][ODBC Microsoft Access Driver] Undefined function 'FormatDateTime' in expression. 

/taxi/test.asp, line 19
Medlem sedan dec. 20025 483 inlägg
#20

FormatDateTime är ingen Access-funktion. Du kanske får använda Format() i stället: http://www.techonthenet.com/access/functions/date/format.php

266 ms totalt · 4 externa anrop · v20260731065814-full.6fe65c25
121 ms — deklarationer (db)
0 ms — hämta statistik (cache)
135 ms — hämta tråd, inlägg och bilagor (db)
128 ms — ändringar (db)