webForumDet fria alternativet
Logga in / Bli medlem

Problem med DateAdd

ASP

21 svar · 502 visningar · startad av Wiklund!!

Medlem sedan juli 2002549 inlägg
Trådstart#1

Jobbar med ett litet statistik script till min community. Jag har gjort ett diagram för att visa antal inloggningar de 10 senaste dagarna. Problemet jag har är att jag inte lyckas räkna de olika inloggningarna per dag.

Så här ser koden ut där jag räknar logins:

set count = connect.execute("SELECT Count(*) AS logins1 FROM logins WHERE logindate = '" & DatePart("d",date) & "'")
logins1 = count("logins1")

set count = connect.execute("SELECT Count(*) AS logins2 FROM logins WHERE logindate = '" & DatePart("d",-1,now()) & "'")
logins2 = count("logins2")

Är det inte så man använder DatePart? Har testat med DataAdd men det fungerar tyvärr inte häller.

edit: logindate innehåller ett Now() datum. Använder mySQL.

Medlem sedan nov. 20017 144 inlägg
#2

Det borde vara dateAdd
dateAdd("d",-1,date) : skall ge gårdagens datum

Medlem sedan juni 200032 967 inlägg
#3

Som JesperT skrev: Nej, det är inte så man använder DatePart(). Kontrollera alltid hur din färdiga SQL-fråga ser ut med en utskrift, så ser du att värden inte blir som du önskar. Hur är datumen lagrade? Som rena datum, eller som datum-tidvärden? Är det datumfält i tabellen?

Kika i VBScript-referensen så ser du hur man använder datumfunktionerna.

Medlem sedan dec. 20003 887 inlägg
#4
set count = connect.execute("SELECT Count(*) AS logins2 FROM logins WHERE logindate = '" & DateAdd("d", -1, Now()) & "'")
logins2 = count("logins2")

Referenser är guld värda... MySQL Reference.

Medlem sedan juli 2002549 inlägg
#5

Får det inte att fungera. Sparar datumen i Now() format i en kolum som har typen DATETIME.
Har inte en aning om varför det inte fungerar. tycker ju att det borde göra det.

Om jag gör så här får jag fram nått iaf:

WHERE logindate > '" & DateAdd("d", -1, Now()) & "'")
Medlem sedan maj 2000175 inlägg
#6

Prova:

WHERE logindate > #" & DateAdd("d", -1, Now()) & "#")
Medlem sedan dec. 200012 464 inlägg
#7

Problemet är att du använder now när du lagrar data. now() innefattar även tid så det blir aldrig lika när du bara jämför med ett datum.

set count = connect.execute("SELECT Count(*) AS logins2 " & _
" FROM logins " &_
" WHERE to_days(current_date) - to_days(logindate) between 0 and 1 " & _
" group by to_days(logindate) "
" order by to_days(logindate) "

Så får du båda värdena i samma fråga ordnade med värdet för gårdagen först. Om du bara vill lagra datumet så är det bättre att använda funktionen current_date i SQL.

Medlem sedan juli 2002549 inlägg
#8

Tack så mycket! Nu vet jag principen. Men om det inte finns någon post det datumet så får jag upp detta felmeddelande:

ADODB.Field (0x800A0BCD)
Antingen är BOF eller EOF satt till True, eller så har aktuell post raderats. Den begärda åtgärden kräver en aktuell post.

Medlem sedan juni 200032 967 inlägg
#9

Ja, du måste alltid kontrollera att recordsetet inte är tomt innan du försöker använda värden (som då inte finns).

if not objRS.EOF then
   ' det finns data, skriv ut, eller vad du nu ska göra
else
   ' recordsetet är tomt, gör nåt annat
end if

mvh

Medlem sedan juli 2002549 inlägg
#10

Tack så mycket. Fungerar fint.
Men som vanligt har jag en fråga till :)
Någon som vet hur jag ska göra för att få fram den dagen som det gjordes flest inloggningar samt antalet. Datumet är ett plus i kanten, det viktiga är antalet.

Medlem sedan nov. 20017 144 inlägg
#11

Nu vet jag inte vad dina kolumner heter, men min princip är denna:

"SELECT Top 1 * FROM members ORDER BY logins"

Sedan skriver du väl bara ut datumet och annat som vanligt.

Medlem sedan juli 2002549 inlägg
#12

Problemet är att i tabellen som heter logins har jag bara sparat: Id och datumet. Jag skulle vilja få fram den dagen som har flest inloggningar.
Har testat lite med denna kod:

SQL = "select count(*) as antal, logindate from logins group by logindate order by 1 DESC"
rs.Open SQL, Connect, 1, 2

if not rs.eof then
response.write ""&rs("logindate")&": "&rs("antal")&"."
end if

rs.close
Medlem sedan mars 20015 287 inlägg
#13

Om man använder sig av den sqg-fråga du har och sorterar på antalet då? Kan det fungera? (Jag har ingen aning...)

set count = connect.execute("SELECT Count(*) AS logins2 " & _
" FROM logins " &_
" WHERE to_days(current_date) - to_days(logindate) between 0 and 1 " & _
" group by to_days(logindate) "
" order by logins2 "
Medlem sedan juli 2002549 inlägg
#14

Det är nog nått sånt man ska göra, men fick felmeddelandet:

Feltyp:
ADODB.Recordset (0x800A0BB9)
Parametrarna är felaktiga, ligger utanför tillåtet intervall eller skapar en inbördes konflikt.
Medlem sedan juni 200032 967 inlägg
#15

Hur ser din kod ut då? Rätt namn på connection-objekt etc?

Medlem sedan juli 2002549 inlägg
#16

Hela koden:

Set Connect   = Server.CreateObject("ADODB.Connection")
Set rs = Server.CreateObject("ADODB.Recordset")
Connect.Open "driver=MySQL;server=localhost;uid=wiklund;pwd=jadu;database=es;option=16384" 

SQL = connect.execute("SELECT Count(*) AS logins2 FROM logins WHERE to_days(current_date) - to_days(logindate) between 0 and 1 group by to_days(logindate) order by logins2")
rs.Open SQL, Connect, 1, 2

if not rs.eof then
response.write ""&rs("logindate")&": "&rs("logins2")&"."
end if

rs.close
connect.close
Medlem sedan juli 2002549 inlägg
#17

Ingen som vet?

Medlem sedan juni 200032 967 inlägg
#18

Det har nog inte med saken att göra, men till att börja med har du inget fält som heter logindate i recordsetet rs. Ta bort det ur utskriften.

I övrigt, detta borde fungera:

Set Connect   = Server.CreateObject("ADODB.Connection")
Set rs = Server.CreateObject("ADODB.Recordset")
Connect.Open "driver=MySQL;server=localhost;uid=wiklund;pwd=jadu;database=es;option=16384" 

SQL = "SELECT Count(*) AS logins2 FROM logins WHERE to_days(current_date) - to_days(logindate) between 0 and 1 group by to_days(logindate) order by logins2"
rs.Open SQL, Connect, 1, 2

if not rs.eof then
response.write rs("logins2")
end if

rs.close
connect.close

Du kommer nog få något nytt felmeddelande nu, jag är lite osäker på vad du vill ha ut av SQL-frågan.

Mvh

Medlem sedan juli 2002549 inlägg
#19

Fick inget felmeddelande, men tyvärr fick jag inte rätt tal utskrivet.
Det jag vill få fram är alltså vilken dag det har gjorts flest inloggningar.

Tabbellen ser ut så här:
Id
Logindate (DATETIME)

När jag kollar förhand i databasen så är rekordet 12. Med denna kod fick jag ut 1.

Medlem sedan mars 20015 287 inlägg
#20

Skjuter vilt från höften, antingen skriver du, sql-raden:

SQL = "SELECT Count(*) AS logins2 FROM logins WHERE to_days(current_date) - to_days(logindate) between 0 and 1 group by to_days(logindate) order by logins2 desc"

Eller så här: (ev. lägg till desc)

Set Connect   = Server.CreateObject("ADODB.Connection")
Set rs = Server.CreateObject("ADODB.Recordset")
Connect.Open " driver=MySQL;server=localhost;uid=wiklund;pwd=jadu;database=
es;option=16384" 

SQL = "SELECT Count(*) AS logins2, logindate FROM logins WHERE to_days(current_date) - to_days(logindate) between 0 and 1 group by to_days(logindate) order by logins2"
rs.Open SQL, Connect, 1, 2

if not rs.eof then
response.write rs("logins2")
end if

rs.close
connect.close

Där borde du väl även kunna plocka ut logindate...

262 ms totalt · 4 externa anrop · v20260731065814-full.51f67c91
124 ms — deklarationer (db)
0 ms — hämta statistik (cache)
135 ms — hämta tråd, inlägg och bilagor (db)
124 ms — ändringar (db)