Avatar billede doncarnage Nybegynder
20. oktober 2010 - 13:56 Der er 3 kommentarer og
1 løsning

Select query mellem datoer (simpel kalender)

Goddag eksperter,

Jeg har lavet en lille simpel kalender, som jeg gerne vil have til at fungere efter hensigten. Jeg har muligvis opbygget tabellen i databasen dumt op i og med jeg har adskilt dag, måned og år.. Men håber alligevel det kan lade sig gøre at fikse uden de største problemer ;)

Tabelstruktur ser ud som her:
------------------------------------------------
TodoID, Title, Text, DeadlineDay, DeadlineMonth, DeadlineYear
------------------------------------------------

Datoerne man vælger gemmer jeg i følgende sessions:
------------------------------------------------
$_SESSION['todo_aarstalstart'] = clean($_POST['aarstalstart']);
$_SESSION['todo_dagstart'] = clean($_POST['dagstart']);
$_SESSION['todo_maanedstart'] = clean($_POST['maanedstart']);
$_SESSION['todo_dagslut'] = clean($_POST['dagslut']);
$_SESSION['todo_maanedslut'] = clean($_POST['maanedslut']);
$_SESSION['todo_aarstalslut'] = clean($_POST['aarstalslut']);
------------------------------------------------


Men hvordan får jeg gjort således at SQL query'en udvælger korrekt ud fra de valgte datoer? Jeg har prøvet med "between" og følgende query:

<?php
    $query = mysql_query("
        SELECT * FROM tbl_todo WHERE
      DeadlineDay between ".$_SESSION['todo_dagstart']." and ".$_SESSION['todo_dagslut']." and
      DeadlineMonth between ".$_SESSION['todo_maanedstart']." and ".$_SESSION['todo_maanedslut']." and
      DeadlineYear between ".$_SESSION['todo_aarstalstart']." and ".$_SESSION['todo_aarstalslut']."
      ORDER BY DeadlineYear DESC, DeadlineMonth DESC, DeadlineDay DESC
        ") or die(mysql_error());
?>



Men den virker desværre ikke 100% efter hensigten, hvis man fx vælger fra den 31.01.2010 til den 31.12.2011.. Så får man klart nok ingen outputs medmindre dagen netop er den 31., til trods for at der er et helt år til forskel :/
Avatar billede intenz Novice
20. oktober 2010 - 15:30 #1
Du skal ikke opfinde en ny måde at gemme datoer på, der kommer der ikke andet end problemer ud af. MySQL's har et DATE felt der er beregnet til den slags.

Du skal gå gemme dine datoer i formatet YYYY-MM-DD i dit felt.

Og vil så bare kunne hente det som:
SELECT * FROM tbl_todo WHERE deadline BETWEEN '2010-01-31' AND '2011-12-31'
Avatar billede doncarnage Nybegynder
20. oktober 2010 - 15:42 #2
Ville helst undgå at lave om i det, men prøver at kigge videre på det i morgen så med din metode, hvis det ikke skaber andet end problemer ;)

Men hvordan samler og gemmer jeg så datoen/deadline i én række af typen "DATE" i DB når jeg har tre forskellige select-menuer til datoen/deadline? Har nemlig en selectmenu for dag, måned og år, der så skal samles til ét felt..
Avatar billede intenz Novice
20. oktober 2010 - 16:44 #3
Du samler dem bare samme i PHP.

F.eks. det du har her:
$_SESSION['todo_aarstalstart'] = clean($_POST['aarstalstart']);
$_SESSION['todo_dagstart'] = clean($_POST['dagstart']);
$_SESSION['todo_maanedstart'] = clean($_POST['maanedstart']);

Kunne samles til en DATE værdi med:
$_SESSION['todo_datostart'] = clean($_POST['aarstalstart']).'-'.clean($_POST['maanedstart']).'-'.clean($_POST['dagstart']);

Du behøver jo ikke lave det om :) Men det er typisk nemmere at gemme data'et på den mest optimale måde i MySQL én gang. I stedet for at skulle kæmpe med data'et hvér gang du skal lave et kald til dag.
Avatar billede doncarnage Nybegynder
22. oktober 2010 - 18:05 #4
Sådan.. Du havde ret i at det godt nok var en del nemmere ;) Tak for hjælpen
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
Vi tilbyder markedets bedste kurser inden for webudvikling

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