webForumDet fria alternativet

Krånglig fråga med klockslag!

Databaser & SQLur Databashanterare & SQL

131 svar · 4 120 visningar · startad av oskars · sida 2 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
#21

Jag är för trött för det här nu :(

weekday(Format(#Left(Startdatum,4) &""/""& Left(Right(Startdatum,4),2) &""/""& Right(Startdatum,2)#,'yyyy/mm/dd')
Microsoft OLE DB Provider for ODBC Drivers error '80040e14' 

[Microsoft][ODBC Microsoft Access Driver] Syntax error in date in query expression 'weekday(Format(#Left(Startdatum,4) &[/]& Left(Right(Startdatum,4),2) &[/]& Right(Startdatum,2)#,'yyyy/mm/dd')) = 6 AND NOT K1 = 6'. 

/taxi/test.asp, line 19

Jag borde gå och lägga nu istället för att mecka med det här!

EDIT: Jag fick det att funka med Format(#25-07-2008#,'yyyy-mm-dd')... men det är när jag börjar krångla med Left() och det som det knasar ihop sig!

Medlem sedan mars 20041 505 inlägg
#22

Måste bara fråga varför du sparar datum och tider som tal?! :P

Medlem sedan nov. 20051 317 inlägg
#23

Jag kan tyvärr inte skylla på mig själv här. Det är inte min databas :) Funderar på att fixa så att det sparas korrekt. :) Men det är iaf anledningen. Datan kommer först från ett mindre modernt system, sen in i Access :)

Medlem sedan dec. 20025 483 inlägg
#24
Weekday(CDate(Mid(Startdatum, 5, 2) & "/" & Right(Startdatum, 2) & "/" & Left(Startdatum, 4)), 2)
Medlem sedan nov. 20051 317 inlägg
#25

Tack så hjärtligt för att du tar dig tid, återigen!

Nu förstår jag även hur du vill att jag ska formatera datumet!

Jag har gjort en grej som kanske underlättar! Jag har gjort om 20070725 till 2007-07-25 i databasen. Mao så står datumen i datumformat... Vilket kanske gör att vi mår bättre?

<%
	Session.LCID = 1053

	Set Connect = Server.CreateObject("ADODB.Connection")
	Connect.Open "Driver={Microsoft Access Driver (*.mdb)}; DBQ=" & Server.MapPath("db.mdb")

	Starttid = "1400"
	Sluttid = "1500"
	
	mittStartdatum = "2008-07-25"

	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 < Startdatum),1,0)) " & _
  				" AS Tal FROM kredit WHERE Startdatum = CDate("&mittStartdatum&") AND NOT K1 = '6'", Connect, 3, 3

	Do Until RecSet.EOF

		Response.Write Startdatum & " - " & RecSet("Tal")

	RecSet.MoveNext
	Loop
%>

Jag får bara ut ett "-" på sidan med den koden nu när jag har gjort om datumformatet. Så på något sätt måste väl den skrivas om för datumformatet?

Borde jag göra om klockslagen till riktig tidsformat också? Eller klarar jag mig med bara "1430" i databasen, istället för "14:30"?

Mvh
Oskar

*inlägget är redigerat*

Medlem sedan dec. 20025 483 inlägg
#26

Har du ändrat datatyp på datumfälten i databasen från tal till datum? Om inte, och du i stället valt strängar, så vore det ännu bättre med datumformat. Och i sådana fall kan du lika gärna slå ihop startdatum med starttid och slutdatum med sluttid -- det vore det allra bästa :)

Att bara byta format från 20070825 till 2007-08-25 ser jag ingen poäng med.

Medlem sedan nov. 20051 317 inlägg
#27

Det var som tal först, men nu är det datumformat :) :) :) Ett riktigt sådant! alltså ÅÅÅÅ-MM-DD...

Vill du att jag ska slå ihop så det blir ÅÅÅÅ-MM-DD HH:MM också? Är det svårt att göra direkt i Access?

Medlem sedan dec. 20025 483 inlägg
#28

Nej, du bör kunna fixa det med en UPDATE - typ:

update
  tbl
set
  startdatetime = cdate(startdate & " " & left(starttime,2) & ":" & right(starttime,2)),
  enddatetime = cdate(slutdatum & " " & left(sluttid, 2) & ":" & right(sluttid,2))
Medlem sedan nov. 20051 317 inlägg
#29

Aha, ja jo! :) Så sant så.

Men kanske ska skita i att slå ihop dom. Blir krångligare då ... Det funkar väl bra med den frågan du gav mig senast? Fast den måste göras om till datumformat.. Fattar bara inte hur man gör det. Har inte jobbat så mkt med datum i Access... :o :)

Medlem sedan dec. 20025 483 inlägg
#30

Hur ser koden ut nu som du har problem med?

Medlem sedan nov. 20051 317 inlägg
#31

Så här... fast nu funkar det tror jag :l Men vettefan om resultatet som man får fram stämmer. Hur ska jag kunna dubbelkolla det liksom :) Om jag kör frågan så som den är nu får jag fram 91st resultat! Orka räkna igenom datan själv för att få fram det manuellt!

Nått tips där för att va på den säkra sidan?

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title></title>
</head>
<body>

<%
	Session.LCID = 1053

	Set Connect = Server.CreateObject("ADODB.Connection")
	Connect.Open "Driver={Microsoft Access Driver (*.mdb)}; DBQ=" & Server.MapPath("db.mdb")

	Starttid = "1100"
	Sluttid = "1200"
	
	mittStartdatum = "2007-09-01"
	
	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 edit", Connect, 3, 3

	Do Until RecSet.EOF

		Response.Write mittStartdatum & " - " & RecSet("Tal")

	RecSet.MoveNext
	Loop
%>
</body>
</html>

EDIT: La till en bild!

db.JPG
Medlem sedan dec. 20025 483 inlägg
#32

Kolla ett par datum genom att lägga till 'WHERE startdatum = 20080725'. Alternativt kan du skapa en kopia av databasen och tömma den. Sedan lägger du in ett par datum i taget och ser vad du får för resultat.

Stämmer det så kanske du kan anta att även övriga stämmer :)

Medlem sedan nov. 20051 317 inlägg
#33

Det verkar fan stämma, efter att jag gjort en kontroll på en mindre version av databasen.

Förstår inte att den kommer fungera även när den går över dygnsgränserna... men den ska tydligen göra det?

Medlem sedan dec. 20025 483 inlägg
#34

Enligt mina beräkningar så borde den det. Testa att lägga in några testdatum :bire

Medlem sedan nov. 20051 317 inlägg
#35

Testet gick bra :) Verkar fungera!

Nu har jag jag gjort en funktion som ökar Sluttiden med 80%... av vissa anledningar :)

Varför får jag inte göra så här i SQL-frågan: ...OR (addTime(Sluttid) > '"&Starttid&"'...

addTime() är min funktion, men när jag försöker köra den i min SQL-fråga säger den typ att jag har en odefinierad funktion... Dumt tycker jag. Vore väldigt trevligt att få använda den där :)

Medlem sedan dec. 20025 483 inlägg
#36

Det går inte att göra så eftersom det är Access som exekverar frågan, och i Access värld finns ingen funktion som heter addTime(). Om du vill kunna skriva så där får du skapa en modul i Access i vilken du definierar addTime().

Medlem sedan nov. 20051 317 inlägg
#37

Är detta något som du tror jag kan göra? Eller är det överkurs? Vore rätt gött att ha det så...

Så här ser min funktion ut:

	Function addTime(Starttid,Sluttid)
	
		Starttid = (Left(Starttid,2)*60) + Right(Starttid,2)
		Sluttid = (Left(Sluttid,2)*60) + Right(Sluttid,2)

		' Här räknar vi ut resans längd
		Totalt = Sluttid - Starttid
		
		' Här lägger vi till 80% på resan
		ResaProcent = Round(Totalt * 1.8,0)
		
		' Nu har vi fått resans längd + 80%

		' Här lägger vi till resan+80% på starttiden
		HelaResan = Starttid + ResaProcent
		
		' Här räknar vi ut timmarna i decimaltal
		HelaResan = Round(HelaResan / 60,2)

		' För att få ut minuterna tar jag bort bort siffror från höger och lägger i en variabel
		' och lägger till 0, i strängen.
		
		' Det blir problem om det bara är 1st decimal
		' Därför måste jag lära mig Split()
		
		' Jag splittar upp decimaltalet i heltal och decimaler
		
		If InStr(HelaResan,",") Then		
			Minuterna = Split(HelaResan,",")
			' Och lägger till 0, innan decimalerna för att få minuterna separerade
			Min = "0," & Minuterna(1)
		Else
			Min = "0," & Min
		End If
		
		' För att få ut timmarna tar vi först och tar bort decimalerna från heltalet
		Tim = HelaResan - Min
		Tim = Round(Tim,0)

		' För att få fram minuterna i "riktiga" minuter så gångar vi dom med 60 och avrundar bort decimalerna
		Min = Round((Min*60),0)
		
		' För att ordna formatet 0603 (så att det blir en nolla i början av timmarna och minuterna om så behövs)
		If Len(Tim) = 1 Then
			Tim = "0" & Tim
		End If
		
		If Len(Min) = 1 Then
			Min = "0" & Min
		End If
		
		addTime = Tim & Min
		
	End Function

Det vore ju fint om man kan spara den koden i Access direkt på något sätt?

Medlem sedan dec. 20025 483 inlägg
#38

Det bör gå alldeles utmärkt. Skapa en ny modul i Access och klistra in ovanstående funktion i kodfönstret. Spara sedan modulen med lämpligt namn och anropa addTime() precis som du gör nu.

Medlem sedan nov. 20051 317 inlägg
#39

Okej! Nice!

Ska testa mig på det! Verkar gå rätt fint vad jag sett i Access nu... Det är väl typ ett macro man ska göra? eller nått.. ska testa sen :)

Medlem sedan dec. 20025 483 inlägg
#40

I den dialog där du väljer mellan tabeller, frågor, formulär m.m. finns även alternativet Moduler :)

153 ms totalt · 3 externa anrop · v20260731065814-full.55e59744
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
148 ms — hämta tråd, inlägg och bilagor (db)