Avatar billede EveryMA Mester
01. januar 2011 - 01:30 Der er 17 kommentarer og
1 løsning

Count med DateDiff

Hej.
Hvordan tæller man via. datediff som i dette eksempel:

Sql = "select count(*) as antal from xxx"

Den er normal, men hvis jeg indsætter datediff?


Sql = "select count(*) as antal from xxx where datediff("n", online,now()) > 2"

Altså "online" er en tabel med en dato i, så skal den finde ud af hvor mange der har en "online"-status på over 2 minutter.

Den kode dér fungerer desværre ikke.
Avatar billede erikjacobsen Ekspert
01. januar 2011 - 01:44 #1
Hvilket databasesystem anvender du?
Avatar billede EveryMA Mester
01. januar 2011 - 01:54 #2
Jeg bruger mySQL + asp

min kolonne ONLINE er angivet som Varchar 255, og fungerer korrekt på min online liste med at vise hvem der seneste har været aktiv inden for 2 minutter.
Avatar billede erikjacobsen Ekspert
01. januar 2011 - 02:01 #3
Hvor har du set at man kan gøre sådan med DATEDIFF ?

Kig på http://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html#function_datediff

Du skal nok bruge DATE_ADD og sammenligne de to datoer.

Men hvorfor bruger du en VARCHAR til en dato+tid? Der bør man bruge en DATETIME.
Avatar billede EveryMA Mester
01. januar 2011 - 02:05 #4
Jeg har heller ikke set det på den måde.

Det var bare for at vise hvad jeg ville :)

Jeg har tit problemer med DATETIME, og jeg synes generelt varchat fungerer ganske ok.

Kan du give mig et eksempel med DateAdd som finder antallet ?
Avatar billede erikjacobsen Ekspert
01. januar 2011 - 10:35 #5
Kan du først fortælle mig hvad der står i dit `online` felt? Er det på formen:  '2011-01-01 10:35:00'  ?
Avatar billede EveryMA Mester
01. januar 2011 - 11:24 #6
Den bliver opdateret med now(), hvilket giver følgende:

01-01-2011 11:23:11 :)
Avatar billede erikjacobsen Ekspert
01. januar 2011 - 11:48 #7
Det format kan du ikke bruge - det er derfor DATETIME anbefales. Med DATETIME fungerer de indbyggede dato-beregningsfunktioner.

Men jeg forstår ikke. I mysql vil now() give  '2011-01-01 02:46:06'

Jeg kan ikke lige se hvad der er smartest at gøre for dig...
Avatar billede EveryMA Mester
01. januar 2011 - 12:00 #8
Selvfølgelig kan jeg bruge det.
Muligvis ikke det smarteste, men det fungerer jo ganske fint med alle de andre funktioner jeg har lavet med DateDiff og min Online.

Men okay. Lad os sige jeg har valgt datetime, hvordan vil du så bruge COUNT og Datediff, som jeg gjorde i 1. indlæg - ikke at det SKAL være på den måde, men hvordan skal det laves så, hvis det f.eks. var datetime?
Avatar billede erikjacobsen Ekspert
01. januar 2011 - 12:28 #9
Jeg ville bruge DATE_ADD, eller DATE_SUB, til at trække 2 minutter fra, eller lægge 2 minutter til, enten `online` eller now(). Så har du to DATETIME der kan sammenlignes.
Avatar billede EveryMA Mester
01. januar 2011 - 12:30 #10
I sig selv kan jeg sagtens lave:

if datediff("n", online,now()) > 2 then
response.write "aktiv"
end if

det virker jo ganske ok.
men det ikke det at sammenligne der er problemet, for som skrevet virker det ok - det er det at tælle hvor mange der har den samme sammenligning.
Avatar billede erikjacobsen Ekspert
01. januar 2011 - 12:41 #11
Det du skriver er i VBScript (ASP), og kan ikke direkte overføres til mysql. Det er generelt bedst (mest effektivt) at lade databasen klare så meget som den nu kan.

Jeg kan forstå på dig nu, at når du siger "now()", så er det i VBScript du gør det, hvorfor du får det ubrugelige format '01-01-2011 11:23:11', der ikke kan anvendes til MySqls dato-funktioner.

Så der er jo en slags konflikt ;)
Avatar billede EveryMA Mester
01. januar 2011 - 12:53 #12
Jo jo, men nu siger jeg jo også: Hvis jeg skifter til dato format. Hvordan ville du så gøre? :)

Du har skrevet i 5 indlæg nu at det er ubrugeligt med varchar :)
Jamen så hvis jeg skifter, hvordan skal det så se ud?

Altså alt er jo i databasen, og så vidt jeg ved så det en normal count-funktion - men det ved jeg jo netop ikk.
Det derfor jeg lavede tråden! :)
Avatar billede erikjacobsen Ekspert
01. januar 2011 - 13:05 #13
Som i nummer #9.  er klokken nu 2011-01-01 13:03:00 så bruger du DATE_SUB i MySql til at trække 2 minutter fra, så du får 2011-01-01 13:01:00, og så kan du finde de poster, der er nyere end 2011-01-01 13:01:00
Avatar billede EveryMA Mester
01. januar 2011 - 13:08 #14
Jo, jeg har jo forklaret jeg godt kan finde dem der er nyere.

Men jeg spørger om hvordan man TÆLLER hvor mange der er nyere.
Avatar billede erikjacobsen Ekspert
01. januar 2011 - 13:12 #15
Det gør du ved at sætte en count(*) på, som du skriver i spørgsmålet. Det eneste der er galt i den SQL-sætning er anvendelsen af DATEDIFF hvor du bruger syntaksen fra VBScript, altså det der kommer efter WHERE.
Avatar billede EveryMA Mester
17. januar 2011 - 21:17 #16
Erik -> Smid et svar.
Jeg har undladet at taste ind hvor mange nye der var, men du brugte tid og hjalp mig, så smid et svar:)
Avatar billede erikjacobsen Ekspert
17. januar 2011 - 23:50 #17
Jeg samler slet ikke på point, tak. Svar selv, og accepter dit eget svar.
Avatar billede EveryMA Mester
18. januar 2011 - 00:02 #18
ok tak :)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester