Regels uit database halen die tussen 2 datums zitten
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.
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.
$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... :)
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.