Rekenen met datums
Stel ik heb een datum in de vorm van 2008-04-18. Nu zou ik willen bepalen of die datum vroeger dan de huidige datum is.
Bijvoorbeeld
2009-04-15 is LATER dan NU.
2007-06-13 is VROEGER dan NU.
Een simpel rekensommetje van huidige datum en gegeven datum, maar ik weet niet naar wat ze te converteren, of welke functies te gebruiken. Heeft iemand raad?
Ik zou het denk ik met mysql oplossen maar ja wie ben ik :P
nouja met mysql, het is onderdeel van een $_POST valideer functie VOOR ik het in een database opsla... dus in dit geval zie ik dat zo niet echt zitten
http://nl2.php.net/manual/en/ref.datetime.php
http://www.php.net/date
http://www.php.net/strtotime
http://www.php.net/checkdate
http://www.php.net/mktime
alvorens je een topic opend
Code (php)
1
2
3
4
5
6
2
3
4
5
6
$datum = "2009-04-15";
$timestamp_datum = strtotime($datum);
$timestamp_nu = time();
if ($timestamp_datum - $timestamp_nu) < 0 ) {
echo "datum is in het verleden"; }
$timestamp_datum = strtotime($datum);
$timestamp_nu = time();
if ($timestamp_datum - $timestamp_nu) < 0 ) {
echo "datum is in het verleden"; }
Gewijzigd op 01/01/1970 01:00:00 door Michiel
Beiden kloppen.
Edit: waarom met timestamps als je met data ook kan rekenen? Een timestamp is niks waard.
20090415 - 20080509 is ook groter dan 0.
Gewijzigd op 01/01/1970 01:00:00 door Jesper Diovo
dit topic. Hopelijk zie je dan in dat timestamps 'not done' zijn.
@Michiel, mag ik je verwijzen naar Terwijl mijn script een POST variabel check script, en mijn gegevens uit post formulieren komen en NIET uit de database.
Tenzij ik het mis heb dat current_date enkel werkt in queries....
Het moet volgens mij dus via PHP... tenzij ook deze denkwijze mis is...
Ik sla mijn datum (indien geldig) ook niet op als timestamp maar als date, maar eerst moet ik dus checken of het geldig is en daarvoor moet ik rekenen met een datum in PHP...
EDIT: 20090415 - 20080509 is ook groter dan 0.
Nou daar heb ik wat aan, dat lijkt me idd de oplossing in PHP te zijn....! Hier zocht ik dus naar denk ik ;)
Gewijzigd op 01/01/1970 01:00:00 door Michiel
PHP oplossing, zonder timestamps:
Als dat het geval is, dan kun je met behulp van de query van Djemo bijvoorbeeld kijken naar jouw eisen. Wanneer die eisen kloppen, dan kun je het formulier verwerken (dus toevoegen) in je database.
Als dat niet het geval is, heb ik de vraag: Wat moet je dan met dat formulier?
formulier wordt gesubmit => check datum => indien geldig: database; indien ongeldig: formulier weer weergeven + foutmelding.
Nu zeg jij dat je die check datum met een query zou doen via mysql...
Echter is er van opslaan in database nog geen sprake, dus ik snap dit niet. Gebruik je nu een query om te checken of iets klopt... zonder ook maar iets van gegevens te kunnen queryen.
Kan je daar een concreet voorbeeld van geven dan? Want ik snap dit niet en zou het graag snappen. Ik zou niet weten welke query uit te voeren... maar zou het toch graag begrijpen..
Dus allereerst een controle met checkdate() of de datum wel geldig is en daarna een controle via timestamps of de datum wel in het verleden ligt. Pas daarna dus invoeren in de database in het formaat yyyy-mm-dd. Vanaf dan gebruik je enkel nog de database om te rekenen met de data die je opgeslagen hebt.
Als je postgresql (of een andere goede database) gebruikt, kun je ook een CHECK constraint aanbrengen op de datum kolom. Op die manier kun je het op database niveau onmogelijk maken om een datum in de toekomst in te voeren. Helaas is dit met MySQL niet mogelijk...
Gewijzigd op 01/01/1970 01:00:00 door Joren de Wit
Inderdaad, als je de check voordat je het in de database stopt wilt doen, dan is het net zo makkelijk om dat in PHP te doen. Je kunt overigens wel met de IF() statement in MySQL condities creëren, maar dat lijkt me weer overkill.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
INSERT INTO tabel
(
kolomnaam,
datumveld
)
VALUES
(
'waarde',
CASE WHEN '2008-06-06' > CURRENT_DATE THEN
CURRENT_DATE
ELSE
'2008-06-06'
END
)
(
kolomnaam,
datumveld
)
VALUES
(
'waarde',
CASE WHEN '2008-06-06' > CURRENT_DATE THEN
CURRENT_DATE
ELSE
'2008-06-06'
END
)
Maar goed, of dit nuttig is door dit zonder melding in te voeren, kun je je afvragen...