Avatar billede nemlig Professor
17. juni 2010 - 11:24 Der er 7 kommentarer og
1 løsning

Select, hvor der hentes poster mellem 2 datoer

Hejsa.
Jeg har en tabel med en række poster, som bla. har et datofelt (slutdato) med [datetime] format.
Jeg ønsker at lave et udtræk, hvor slutdato har en værdi, der ligger mellem dagsdato minus 7 dage og dagsdato minus 2 dage.
Altså slutdato mellem 14. juni og 19. juni.

Jeg har prøvet dette?

$sql = "SELECT * FROM `kalender` WHERE `slutdato` BETWEEN DATE_ADD(CURDATE(), INTERVAL -7 DAY) AND DATE_ADD(CURDATE(), INTERVAL -2 DAY)";
Avatar billede nemlig Professor
17. juni 2010 - 11:43 #1
Det her hjælper heller ikke, men giver syntax-fejl:
Jeg smider minus-tegn foran "INTERVAL"

$sql = "SELECT * FROM `kalender` WHERE `slutdato` BETWEEN DATE_ADD(CURDATE(), - INTERVAL 7 DAY) AND DATE_ADD(CURDATE(), - INTERVAL 2 DAY)";
17. juni 2010 - 11:49 #2
Hvad sker der med din query?  For mig at se (og min test bekraefter det) er syntaksen god.  Men naturligvis skal du soege interval-3 og interval+2 for at faa datoer mellem 14 juni og 19 juni.

Med denne tabel:
CREATE TABLE nemlig1(navn VARCHAR(10), slutdato DATE);

INSERT INTO nemlig1 VALUES('navn1', '2010-06-10');
INSERT INTO nemlig1 VALUES('navn2', '2010-06-11');
INSERT INTO nemlig1 VALUES('navn3', '2010-06-12');
INSERT INTO nemlig1 VALUES('navn4', '2010-06-13');
INSERT INTO nemlig1 VALUES('navn5', '2010-06-14');
INSERT INTO nemlig1 VALUES('navn6', '2010-06-15');
INSERT INTO nemlig1 VALUES('navn7', '2010-06-16');
INSERT INTO nemlig1 VALUES('navn8', '2010-06-17');
INSERT INTO nemlig1 VALUES('navn9', '2010-06-18');
INSERT INTO nemlig1 VALUES('navn10', '2010-06-19');
INSERT INTO nemlig1 VALUES('navn12', '2010-06-20');
INSERT INTO nemlig1 VALUES('navn12', '2010-06-21');

gav queryen
SELECT *
FROM nemlig1
WHERE `slutdato` BETWEEN DATE_ADD(CURDATE(), INTERVAL -3 DAY)
                AND DATE_ADD(CURDATE(), INTERVAL +2 DAY)

dette resultat:
cells     
          navn  slutdato 
      navn5 2010-06-14
      navn6 2010-06-15
      navn7 2010-06-16
      navn8 2010-06-17
      navn9 2010-06-18
      navn10 2010-06-19
Avatar billede nemlig Professor
17. juni 2010 - 12:00 #3
Tak for bidraget.
Jeg kigger på det.
Jeg har desværre lavet den fejl, at jeg havde ændret min dato på min server til 21-06-2010, så da jeg skrev spørgsmålet, troede jeg, at datoen var d. 21.

Derfor skulle der have stået:

.....Altså slutdato mellem 10. juni og 15. juni......

Da jeg anvender DATETIME skal jeg vist også i min SQL anvende

DATE(slutdato)
Avatar billede nemlig Professor
17. juni 2010 - 12:36 #4
Hej igen.

Nu kører det.
Fejlen var en 3., som ikke har noget med SQL-sætningen at gøre.

Send venligst et svar, og du får pointene.
17. juni 2010 - 12:48 #5
Saa maaske var min bistand at du havde en at snakke med laenge nok til du fik snakket dig selv til rette.  Det er jeg selv ikke saa sjaeldent ude for.  (Og det er heller ikke ualmindeligt at naar jeg skal formulere et spoergsmaal for Eksperten og vil beskrive saa noejagtigt som muligt hvad problemet er, hvad jeg har gjort, og hvordan det har fejlet, at jeg opdager loesningen.)
Avatar billede nemlig Professor
17. juni 2010 - 12:59 #6
hehe - din bistand var såmænd god nok, idet jeg dermed fokuserede på andet end lige min SQL. Og det løste jo problemet.
Avatar billede showsource Seniormester
17. juni 2010 - 13:59 #7
En anden måde at gøre det på, nu det er php, kunne være at bruge strtotime() til at definere de to datoer.

$past = date("Y-m-d H:i:s", strtotime("-3 DAY"));
$future = date("Y-m-d H:i:s", strtotime("+2 DAY"));

$sql = "SELECT * FROM kalender WHERE slutdato BETWEEN '".$past."' AND '".$future."'";

Jeg ved ikke om det evt. ville være hurtigere i en stor tabel ?
Avatar billede nemlig Professor
17. juni 2010 - 14:02 #8
Åh ja - det er også en løsning. Tabellen er ikke ret stor (200 poster).
Tak for bidraget, som er meget inspirerende for lignende løsninger.
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
Computerworld tilbyder specialiserede kurser i database-management

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