Regels uit database halen die tussen 2 datums zitten
Dag mensen,
ik heb weers een vraagje omtrent een script waarmee ik wil laten zien wie de komende week scheidsrechter is bij een wedstrijd. (http://uttop.nl/index.php?p=content/scheidsrechtersch)
Via de link hierboven zie je het hele schema. Nu wil ik alleen die datums laten zien die de komende week zijn. Het nadeel is dat ik de datums in database in varchar heb staan. (vb: 5-10-2010)
Nu kan ik de id's ophalen en aan hand daarvan de regels ophalen dmv:
$result_id_vandaag =mysql_fetch_assoc(mysql_query("SELECT ssid, datum FROM scheidsrechtersch WHERE datum = '$datum_vandaag'"));
$result_id_week_later = mysql_fetch_assoc(mysql_query("SELECT ssid, datum FROM scheidsrechtersch WHERE datum = '$datum_week_later'"));
Hierbij is de uitkomst van $result_id_vandaag bijv. ssid:10, datum:4-10-2010
en is de uitkomst van $result_id_week_later bijv. ssid:14, datum:11-10-2010
Maar helaas staat niet elke dag in de database, dus werkt bovenstaande code niet elke dag, alleen op de dagen dat beide dagen voorkomen in database.
Doe ik te moeilijk, of is hier wat mee te doen om het toch goed te laten zien?
ik heb weers een vraagje omtrent een script waarmee ik wil laten zien wie de komende week scheidsrechter is bij een wedstrijd. (http://uttop.nl/index.php?p=content/scheidsrechtersch)
Via de link hierboven zie je het hele schema. Nu wil ik alleen die datums laten zien die de komende week zijn. Het nadeel is dat ik de datums in database in varchar heb staan. (vb: 5-10-2010)
Nu kan ik de id's ophalen en aan hand daarvan de regels ophalen dmv:
$result_id_vandaag =mysql_fetch_assoc(mysql_query("SELECT ssid, datum FROM scheidsrechtersch WHERE datum = '$datum_vandaag'"));
$result_id_week_later = mysql_fetch_assoc(mysql_query("SELECT ssid, datum FROM scheidsrechtersch WHERE datum = '$datum_week_later'"));
Hierbij is de uitkomst van $result_id_vandaag bijv. ssid:10, datum:4-10-2010
en is de uitkomst van $result_id_week_later bijv. ssid:14, datum:11-10-2010
Maar helaas staat niet elke dag in de database, dus werkt bovenstaande code niet elke dag, alleen op de dagen dat beide dagen voorkomen in database.
Doe ik te moeilijk, of is hier wat mee te doen om het toch goed te laten zien?
Jochanan V op 04/10/2010 22:25:43:
Het nadeel is dat ik de datums in database in varchar heb staan. (vb: 5-10-2010)
Ga dat eerst maar corrigeren. Met een datum in een varchar kan je helemaal niks.
Het moeilijke wat je doet is datums opslaan als Varchar, daar kan (My)SQL niet goed mee overweg, om te rekenen. Wat je kan doen is eerst een kolom 'sqldate' toe te voegen in je tabel, met wel als eigenschap een datum en dan een scriptje laten lopen in PHP:
Vervolgens heb je alles als datum in je database staan. Hoezee! Dat moet ook, want dan kan je SQL laten rekenen.
Zoiets (uit mijn hoofd) zou het moeten worden, dan regel je het zoals het hoort: In je database.
Zie ook de DATE_FORMAT functie die ik gebruikte. Je hebt nu een virtuele kolom, 'datum_nl' waarin de datum in het formaat staat wat jij nu op slaat in de database.
Code (php)
1
2
3
4
5
6
7
8
2
3
4
5
6
7
8
<?php
$sql_result = mysql_query('SELECT * FROM scheidsrechtersch');
while($row = mysql_fetch_assoc($sql_result))
{
$sqldate = date( 'Y-m-d', strtotime( $row['datum'] ) );
$update = mysql_query('UPDATE scheidsrechtersch SET datum = \'' . $sqldate . '\' WHERE ssid = '.$row['ssid']
}
?>
$sql_result = mysql_query('SELECT * FROM scheidsrechtersch');
while($row = mysql_fetch_assoc($sql_result))
{
$sqldate = date( 'Y-m-d', strtotime( $row['datum'] ) );
$update = mysql_query('UPDATE scheidsrechtersch SET datum = \'' . $sqldate . '\' WHERE ssid = '.$row['ssid']
}
?>
Vervolgens heb je alles als datum in je database staan. Hoezee! Dat moet ook, want dan kan je SQL laten rekenen.
Code (php)
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
SELECT *,
DATE_FORMAT(datum, '%d-%m-%Y') AS datum_nl
FROM
scheidsrechtersch
WHERE
datum
BETWEEN
CURDATE()
AND
CURDATE() + INTERVAL 1 WEEK
DATE_FORMAT(datum, '%d-%m-%Y') AS datum_nl
FROM
scheidsrechtersch
WHERE
datum
BETWEEN
CURDATE()
AND
CURDATE() + INTERVAL 1 WEEK
Zoiets (uit mijn hoofd) zou het moeten worden, dan regel je het zoals het hoort: In je database.
Zie ook de DATE_FORMAT functie die ik gebruikte. Je hebt nu een virtuele kolom, 'datum_nl' waarin de datum in het formaat staat wat jij nu op slaat in de database.
Robert Deiman op 04/10/2010 23:16:26:
Het moeilijke wat je doet is datums opslaan als Varchar, daar kan (My)SQL niet goed mee overweg, om te rekenen. (...)
Geen enkele database kan daar goed mee overweg. Data en tijd horen altijd in de juiste type worden opgeslagen. Ook al is data en tijd niet echt vast gelegd in ANSI SQL heeft iedere database engine wel z'n eigen types daarvoor.
hmm... ben maar toch meteen aan de slag gegaan zoals jullie zeiden, de datum in een goede type te zetten. Dus staat nu als date. Had al wel zitten knoeien met het rekenen tussen datums, maar dat werkte niet met datum in varchar natuurlijk. Volgende werkt dus nu wel met de datum in date vorm.
$datum_vandaag = date("Y-m-d");
$datum_week_later = mktime(0, 0, 0, date("m"), date("d")+7, date("Y"));
$datum_week_later = date("Y-m-d", $datum_week_later);
$result_id_nu_en_week_later = mysql_query("SELECT ssid, datum FROM scheidsrechtersch WHERE datum BETWEEN '$datum_vandaag' AND '$datum_week_later'");
Al heb ik uiteindelijk het stukje van Robert gebruikt, wat natuurlijk nog even makkelijker is :) Hartstikke bedankt.. Het kan zo simpel... :)
$datum_vandaag = date("Y-m-d");
$datum_week_later = mktime(0, 0, 0, date("m"), date("d")+7, date("Y"));
$datum_week_later = date("Y-m-d", $datum_week_later);
$result_id_nu_en_week_later = mysql_query("SELECT ssid, datum FROM scheidsrechtersch WHERE datum BETWEEN '$datum_vandaag' AND '$datum_week_later'");
Al heb ik uiteindelijk het stukje van Robert gebruikt, wat natuurlijk nog even makkelijker is :) Hartstikke bedankt.. Het kan zo simpel... :)
Gebruik gewoon mysql's eigen functies.
of gebruik unix timestamp en ga werken met time...:)
Karl Karl op 04/10/2010 23:47:18:
Gebruik gewoon mysql's eigen functies.
Hij geeft aan uiteindelijk "mijn stukje" te hebben gebruikt. Dat werkte veel gemakkelijker. En je raad het al: Ik gebruik wel mysqls' eigen functies. :)
Robert Deiman op 05/10/2010 09:14:56:
Hij geeft aan uiteindelijk "mijn stukje" te hebben gebruikt. Dat werkte veel gemakkelijker. En je raad het al: Ik gebruik wel mysqls' eigen functies. :)
Karl Karl op 04/10/2010 23:47:18:
Gebruik gewoon mysql's eigen functies.
Hij geeft aan uiteindelijk "mijn stukje" te hebben gebruikt. Dat werkte veel gemakkelijker. En je raad het al: Ik gebruik wel mysqls' eigen functies. :)
Zie eens effe zijn post boven mijn post. Daar doet ie het dus niet.
Tegen jou heb ik geen commentaar :-).
Daar heb ik het ook over: Hij zegt dat hij uiteindelijk mijn code heeft gebruikt omdat hij dat toch makkelijker vond. Dus hij gebruikt uiteindelijk niet zijn eigen geprutste code. :)
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<?php
function upcomingBirthdays(){
$q = mysql_query("select id, birth_month, birth_day
from par_users
where birth_day between DAY(NOW()) and DAY(NOW()) + 10 AND birth_month = MONTH(NOW()) ORDER BY birth_day DESC");
$arr = array();
while($row = mysql_fetch_object($q))
{
if(date("d-m") == $row->birth_day.'-'.$row->birth_month or date("j-m") == $row->birth_day.'-'.$row->birth_month)
{
$u = userInfo($row->id);
$age = $u['age'];
$bold1 = "<img src='include/today.png' /> <span style='font-weight: bolder;font-size: 15px;text-decoration:underline;'>";
$bold2 = "</span>";
}
else
{
$u = userInfo($row->id);
$age = $u['age'] + 1;
$bold1 = "";
$bold2 = "";
}
$arr[] = "<a href='index.php?page=profile&id=".$row->id."'>".$bold1.userName($row->id).$bold2." (".$age.")</a>";
}
return $arr;
}
?>
function upcomingBirthdays(){
$q = mysql_query("select id, birth_month, birth_day
from par_users
where birth_day between DAY(NOW()) and DAY(NOW()) + 10 AND birth_month = MONTH(NOW()) ORDER BY birth_day DESC");
$arr = array();
while($row = mysql_fetch_object($q))
{
if(date("d-m") == $row->birth_day.'-'.$row->birth_month or date("j-m") == $row->birth_day.'-'.$row->birth_month)
{
$u = userInfo($row->id);
$age = $u['age'];
$bold1 = "<img src='include/today.png' /> <span style='font-weight: bolder;font-size: 15px;text-decoration:underline;'>";
$bold2 = "</span>";
}
else
{
$u = userInfo($row->id);
$age = $u['age'] + 1;
$bold1 = "";
$bold2 = "";
}
$arr[] = "<a href='index.php?page=profile&id=".$row->id."'>".$bold1.userName($row->id).$bold2." (".$age.")</a>";
}
return $arr;
}
?>
Een functie die gebruik.




