23. marts 2006 - 13:13Der er
18 kommentarer og 1 løsning
Sortering af (danske) datoer med BETWEEN
Jeg skal have udskrevet data fra mdb mellem to datoer! Det virker fint med datoer på "amerikansk" format dvs "mm/dd/yy" men er det ikke muligt at lave på dansk? "dd/mm/yy"
Jeg har lavet det som nedenstående :
Sql = "SELECT besoeg, kunde,SUM(arbejdstimer + koersel) AS T,SUM(arbejdstimer) AS A, SUM(koersel) AS K FROM report WHERE report.tekniker = '" & session("password-session") & "' AND besoeg BETWEEN '" & Request("datofra") &"' AND '" & Request("datotil") &"' GROUP BY besoeg, kunde"
Sql = "SELECT besoeg, kunde,SUM(arbejdstimer + koersel) AS T,SUM(arbejdstimer) AS A, SUM(koersel) AS K FROM report WHERE report.tekniker = '" & session("password-session") & "' AND besoeg BETWEEN #" & Request("datofra") & "# AND #" & Request("datotil") & "# GROUP BY besoeg, kunde"
Men du skal være sikker på at den opfatter "1/3/2006" som 1. marts og ikke som 3. januar. Det afhænger at styresystemets opsætning, og af den type connection du anvender.
Dit problem er at du bruger tekstfelter i stedet for datofelter. Det gør det lidt svært.
BETWEEN vil så gå efter den alfabetiske rækkefølge så 2006/04/01 vil ligge efter 2006/03/31 og før 2006/04/02.
Hvis du altså skriver datoerne i et format hvor årstal kommer først, så måned og så dato, så vil det virke, hvis du altid bruger foranstillede nuller, altså 2006/04/02, ikke 2006/4/2.
Nu har jeg rettet det i databasen til værende datofelt, og sat # om mit request - og nu sorterer den korrekt. Men på trods af at datoerne i databsen står dd-mm-yyyy så viser den liste jeg udskriver mm/dd/yyyy. Prøvede lige <%=Datevalue(besoeg)%> omkring, med det gjorde intet....
Først: Det du ser når du åbner access'en er ikke det format datoen står i. Et datofelt er i virkeligheden et talfelt, der gemmer antallet af milisekunder siden 1/1/1900. Det du ser er Access's fortolkning, og formatet kan bestemmes i Design Table. Men det bestemmer kun hvordan Access viser datoen.
Når du henter datoen ud til en ASP-side, så er det den driver du angiver i din connectionstring der henter datoen, og det er serveren der bestemmer hvilket format den skal vises i, med mindre du bestemmer det i din kode.
Prøv at skrive Session.LCID = 1030 - øverst i filen, hvis det altså er ASP
Ja ASP lige præcis.... Tænkte nok at der var noget med Session.LCID. Jeg sad lige og ledte efter en artikel jeg så fornylig hvor alle "landekoder"/Session.LCID var beskrevet... Kunne bare ikke huske hvordan jeg fandt den artikel!??
Men når du nu bruger Datofelter, så skal du checkke de steder hvor der skrives datoer til databasen, der kan let være noget galt nu, men det kan løses. Check hvad der sker med ugyldige datoer (31/2 eller 54/16) og check om den opfatter 1/2 som 1. feb eller 2. jan.
Der er mange der er "bange" for datofelter, men læg en besked her hvis du får brug for hjælp med det, det er ikke så svært.
Hmm ja, der er naturligvis lidt kludder. Ugylige datoer såsom 54-16-2006 laver bare en "Data type mismatch in criteria expression." - og det er jo "fint" nok. Datoer med "tal under 31" eksempelvis 12-16-2006 laves derimod om til 16-12-2006
Og nu er det lige gået op for mig at der rent faktisk kun sorteres efter dag! vælges der mellem 01-03-2006 og 20-03-2006 udskrives alle datoer med dage mellem 1 og 20 uanset måned :-(
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.