Avatar billede svjensen Nybegynder
18. marts 2005 - 23:01 Der er 13 kommentarer og
1 løsning

Finde entries med dato en uge frem

Jeg har brug for at lave en select query, der returnerer alle records, hvor dato feltet er inden for de næste 7 dage (fx).

Jeg har prøvet med:

$curdag = date("z");
$strSQL3 = "SELECT * FROM birthday ";
$strSQL3 = $strSQL3."WHERE (date(""z"", birthday.dato) - ".$curdag.") >= 0 ";
$strSQL3 = $strSQL3."AND (date(""z"", birthday.dato) - ".$curdag.") <= 7 ";
$strSQL3 = $strSQL3."ORDER BY dato ASC";
$rs3 = odbc_exec($conn, $strSQL3);

Men der er tilsyneladende en fejl.
Avatar billede svjensen Nybegynder
18. marts 2005 - 23:02 #1
Jeg får en fejl i 3. linie.
Avatar billede taskmgr Nybegynder
18. marts 2005 - 23:14 #2
$curdag = date("z");
$strSQL3 = "SELECT * FROM birthday ";
$strSQL3 = $strSQL3."WHERE (date('z', birthday.dato) - ".$curdag.") >= 0 ";
$strSQL3 = $strSQL3."AND (date('z', birthday.dato) - ".$curdag.") <= 7 ";
$strSQL3 = $strSQL3."ORDER BY dato ASC";
$rs3 = odbc_exec($conn, $strSQL3);
Avatar billede kjulius Novice
18. marts 2005 - 23:59 #3
? Det ser ud til at være PHP kode - og SQL koden ser ikke ud til at være til Access.

Er det bare spørgsmålet, som er placeret i den forkerte gruppe, eller ønskes SQL koden omformet til Access' SQL variant?
Avatar billede kjulius Novice
19. marts 2005 - 01:49 #4
Hvis din SQL skal omformes til Access' variant, skal du ændre i WHERE delen, f.eks. sådan:

WHERE birthday.dato BETWEEN Date() AND DateAdd("d",7,Date())
Avatar billede mugs Novice
19. marts 2005 - 05:53 #5
I ren access må være nok med:

Between Date() And Date()+7

Idet værdien 1 er = 1 dag, så det er ikke nødvendigt med en DateAdd. Desuden vil kjulius SQL give en syntaksfejl, idet der imellem parametrene ikke skal være , men ;
Avatar billede terry Ekspert
19. marts 2005 - 09:48 #6
If you use DateAdd("d";7;Date()) in query designer then go to SQL view you will see that ; have been changed to ,

So in SQL DateAdd("d",7,Date()) should be valid.

The reason why ; is used in query designer (and other places) is because , is used as the decimal seperator with Danish Regional settings. With English Regional settings ; isnt necessary as . is used as decimal seperator, so , is accepted also in query designer (and other places).
Avatar billede mugs Novice
19. marts 2005 - 16:52 #7
Thank's terry.
Avatar billede kjulius Novice
19. marts 2005 - 17:23 #8
--> mugs: Jeg er ikke enig i, at den vil give en fejl. Mit udgangspunkt var, at det var en SQL, som blev sendt via en ODBC request fra PHP. Det er sådan spørgsmålet ser ud for mig. I så fald skal der i høj grad være komma mellem parametrene. Det samme skal der i ren ACCESS med mindre man bruger den grafiske overflade, hvor det ganske rigtigt er semikolon man skal bruge. Men da udgangspunktet er som det er, er det meget usandsynligt, at spørgeren skulle bruge den grafiske overflade.

Du har derimod ret i, at DateAdd ikke er nødvendig i dette tilfælde. Den gør dog heller ingen skade, og - nåja, det er personlig smag - jeg synes det øger kodens gennemskuelighed og gør det nemmere senere at ændre til andre enheder end dage.

--> terry: Thanks for the elaborating explanation.
Avatar billede mugs Novice
19. marts 2005 - 20:04 #9
kjulius > Som terry også har påpeget bør et komma accepteres. Burde have set atr det ikke er ren Access. Jeg beklager.
Avatar billede svjensen Nybegynder
20. marts 2005 - 22:53 #10
OK, jeg har måske ikke været helt klar i mit spørgsmål.

Som det er nævnt arbejder jeg i PHP med en Access DB. I DB har jeg en tabel, med fødselsdage. Jeg ønsker at få et udtræk med alle personer, der har fødselsdag inden for de kommende 7 dage.

Den query jeg har vist i mit spørgsmål, virkede da jeg tidligere arbejdede i ASP, så det kan godt være at jeg skal flytte spørgsmålet til PHP kategorien i stedet, da problemet måske snarere er i programmeringssproget.

På baggrund af jeres forslag har jeg rettet min query til:

$strSQL3 = "SELECT * FROM birthday ";
$strSQL3 = $strSQL3."WHERE dato BETWEEN Date() AND Date()+7 ";
$strSQL3 = $strSQL3."ORDER BY dato ASC";

og jeg har forsøgt at udskifte den mellemste linie med

$strSQL3 = $strSQL3."WHERE dato BETWEEN Date() And DateAdd('d',7,Date()) ";

og sågar med

$strSQL3 = $strSQL3."WHERE dato = Date()";

Men ingen af dem virker, til trods for at jeg har indlagt testdata med fødselsdag i dag og om to dage.

Er der nogen bud på problemet?
PHP returnerer en num_rows på -1
Avatar billede kjulius Novice
20. marts 2005 - 23:55 #11
Er datoen på serveren rigtig? Det er datoen på serveren, ikke klienten der er udgangspunktet, når man sender en SQL med Date() funktionen til serveren.
Avatar billede kjulius Novice
20. marts 2005 - 23:57 #12
Altså database-serveren, hvis der er forskel på webserveren og databaseserveren.
Avatar billede kjulius Novice
21. marts 2005 - 00:04 #13
Hvis du skulle overveje at opbygge datostrenge i PHP, så tænk lige på, at Access skal have en dato på formatet:

#m/d/yy#, altså f.eks. 10. september 2004: "#9/10/2004#" (#9/10/04# accepteres dog også).
Avatar billede svjensen Nybegynder
21. marts 2005 - 07:48 #14
Datoen på serveren er rigtig.

I min Access tabel står datoen i formatet 'dd-mm-yyy'. Jeg har prøvet at indtaste som 'mm-dd-yyyy', men access ændrede det selv tilbage.
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
Dyk ned i databasernes verden på et af vores praksisnære Access-kurser

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