Deel van string selecteren uit db-veld
Ik mijn tabel komt een veld voor dat een datum bevat in string-format, dus gewonen tekst. Nu wil ik, in mijn geval, de jarige van de dag selecteren op basis van dit datumveld. Helaas werkt de syntax van ondertsaande code niet.
Wie weet de juiste syntax? Het datumveld (geboortedatum) heet in mijn database <geboorte> en de inhoud is alsvolgt opgenomen dd-mm-jjjj oftewel 15-07-1948.
Code (php)
1
2
3
4
5
2
3
4
5
$cDag = date('d');
$cMaand = date('m');
$sql = "SELECT * FROM genealogie WHERE substr(geboorte,0,2) = '$cDag' AND substr(geboorte,3,2) = '$cMaand'";
$cResultJarig = mysql_query($sql);
$cMaand = date('m');
$sql = "SELECT * FROM genealogie WHERE substr(geboorte,0,2) = '$cDag' AND substr(geboorte,3,2) = '$cMaand'";
$cResultJarig = mysql_query($sql);
George
Gewijzigd op 15/07/2012 12:22:55 door George van Baasbank
waarom een substr?
Omdat mijn tabel gevoed wordt vanuit een download die geheel opgebouwd is als tekstvelden
$sql = "SELECT * FROM genealogie WHERE geboorte LIKE '".date('d-m')."%'";
De volgende melding kwam uit jouw query:
#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'd-m')."%' LIMIT 0, 30' at line 1
Je hebt het wel compleet overgenomen? Met date('d-m') buiten de dubbele quotes. Bij mij krijg ik gewoon deze query: SELECT * FROM genealogie WHERE geboorte LIKE '15-07%'
George van Baasbank op 15/07/2012 12:38:16:
Omdat mijn tabel gevoed wordt vanuit een download die geheel opgebouwd is als tekstvelden
Je had ze ook bij in het invoeren in het juiste formaat kunnen zetten, had je deze query kunnen maken:
Code (php)
1
2
3
4
5
2
3
4
5
SELECT * FROM genealogie
WHERE
DAY(birthdate) = DAY(CURDATE())
AND
MONTH(birthdate) = MONTH(CURDATE())
WHERE
DAY(birthdate) = DAY(CURDATE())
AND
MONTH(birthdate) = MONTH(CURDATE())
Alsnog wijzigen:
Code (php)
1
2
3
4
2
3
4
ALTER TABLE genealogie ADD COLUMN birthdate DATE AFTER geboorte;
UPDATE genealogie SET birthdate = STR_TO_DATE(geboorte, '%d-%m-%Y');
ALTER TABLE genealogie DROP COLUMN geboorte;
ALTER TABLE genealogie CHANGE COLUMN birthdate geboorte DATE;
UPDATE genealogie SET birthdate = STR_TO_DATE(geboorte, '%d-%m-%Y');
ALTER TABLE genealogie DROP COLUMN geboorte;
ALTER TABLE genealogie CHANGE COLUMN birthdate geboorte DATE;
Ik zie dat je de mysql extensie gebruikt, dus je moet iedere statement in een aparte querie uitvoeren (met mysqli kan dit in 1 querie)
Toevoeging op 15/07/2012 13:16:04:
Nog een leukere ;-):
Code (php)
1
2
3
4
5
6
2
3
4
5
6
SELECT *, YEAR(CURDATE()) - YEAR(geboorte) AS age
FROM genealogie
WHERE
DAY(geboorte) = DAY(CURDATE())
AND
MONTH(geboorte) = MONTH(CURDATE())
FROM genealogie
WHERE
DAY(geboorte) = DAY(CURDATE())
AND
MONTH(geboorte) = MONTH(CURDATE())
Gewijzigd op 15/07/2012 13:16:39 door Ger van Steenderen
Met behulp van jullie suggesties heb ik de volgende (werkende) query samengesteld. Bedankt voor de hulp.
Code (php)
1
2
3
4
2
3
4
// Query voor jarigen
$cVandaag = date("d-m")."%";
$sql = "SELECT * FROM genealogie WHERE geboorte LIKE '$cVandaag'";
$cResultJarige = mysql_query($sql);
$cVandaag = date("d-m")."%";
$sql = "SELECT * FROM genealogie WHERE geboorte LIKE '$cVandaag'";
$cResultJarige = mysql_query($sql);
George
Wellicht vind je me een zeur, maar in mijn ogen hoort een datum als date(time) in de db worden opgeslagen en niet als tekst, daar kan je -zonder extra handelingen- niks mee.
Ik gebruik "de jarige van vandaag" alleen als topic in mijn nieuwe site (http://nieuw.vanbaasbank.nl). Op dit moment heb ik nog geen behoefte om de jarigen van de komende periode te scannen.
Je hebt gelijk als het gaat om de structuur van de database. Een veld met een datum hoort natuurlijk een type <date> te zijn maar ik ben gebonden aan een download van mijn genealogieprogramma die haar output als xls-bestand geeft(Excel) en die door mij t.b.v. de SQL-database wordt omgezet in een csv-bestand. Helaas is het gevolg dan een structuur van uitsluitend tekststructuren. Omdat ik eigenlijk zo min mogelijk wil sleutelen aan mijn php-documenten neem ik deze opbouw maar voor lief.
George