Datum filteren met VARCHAR veld

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Robbert Tromp

Robbert Tromp

27/11/2015 08:26:04
Quote Anchor link
Hallo,

Ik heb een Reserveringsysteem. Nu is de bouwer ervan zo slim geweest om een VARCHAR veld te gebruiken in de database voor datum registratie.

Ik wil echter graag dat de pagina alleen reserveringen van vandaag of nieuwer weergeeft.

Wie o wie kan mij helpen?
IK heb hier even onvoldoende kennis van.

Screen 1

Screen 2

Screen 3
 
PHP hulp

PHP hulp

16/11/2024 05:44:07
 
Jan de Laet

Jan de Laet

27/11/2015 08:39:09
Quote Anchor link
Robbert, google is your friend: https://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html#function_str-to-date

Dit zou volgens mij moeten werken:
SELECT * FROM reserveringen WHERE STR_TO_DATE(datum, "%d-%m-%Y") >= NOW()
Gewijzigd op 27/11/2015 08:40:10 door Jan de Laet
 
Robbert Tromp

Robbert Tromp

27/11/2015 08:40:05
Quote Anchor link
Ik had Google al even gebruikt maar ik kwam er nog niet mee verder.
Eens kijken of dit wel helpt :)

Toevoeging op 27/11/2015 08:45:23:

Helaas krijg een witte pagina
 
Eddy E

Eddy E

27/11/2015 08:45:55
Quote Anchor link
Wellicht kan je beter je database gaan aanpassen.
Even een tijdelijke kolom aanmaken: `datum_new` oid die wel DATE is.
Dan voer je deze query uit:

UPDATE reserveringen SET datum_new = STR_TO_DATE(datum, "%d-%m-%Y");

Daarna verwijder je de kolom `datum` (als datum_new goed is!).
En hernoem je `datum_new` naar `datum`
 
Robbert Tromp

Robbert Tromp

27/11/2015 08:52:13
Quote Anchor link
Ja heb ik ook al aan zitten denken, weet alleen niet of dat problemen gaat opleveren verder.
 
- Ariën  -
Beheerder

- Ariën -

27/11/2015 08:57:05
Quote Anchor link
Als je netjes een DATETIME kolom gebruikt en NOW() in je queries gebruikt, zou het geen kwaad kunnen.
 
Ivo P

Ivo P

27/11/2015 09:08:27
Quote Anchor link
Je zult dan wel moeten gaan zoeken naar alle query's waarbij die varchar datumkolom betrokken was.

De insert- en updatequery's zullen datums als 31-12-2015 proberen aan te leveren.
Die zul je dus op moeten sporen.

Daarnaast is er grote kans dat er op veel plekken iets als echo $row->datum staat.
Daar krijg je na de aanpassing dan de datum als 2015-12-31 te zien.

En mogelijk is er nog code waarbij met bijvoorbeeld substr() gepoogd wordt om de maand bijvoorbeeld uit de datum te vissen.

goed zoeken in de betrokken scripts naar "datum" dus
 
Marthijn Buijs

Marthijn Buijs

27/11/2015 09:11:33
Quote Anchor link
Hoe zit het eigenlijk met je charachter encoding met de database?
Aangezien ik 2x een <wiebertje> zie
 
Jan de Laet

Jan de Laet

27/11/2015 09:16:36
Quote Anchor link
Robert, ivm je witte pagina: dat betekent een fout, set error reporting eens aan.

Mogelijk zit het in gebruik van ' en " quotes in je sql.
 
Robbert Tromp

Robbert Tromp

27/11/2015 09:20:08
Quote Anchor link
PHP Maarten op 27/11/2015 09:11:33:
Hoe zit het eigenlijk met je charachter encoding met de database?
Aangezien ik 2x een <wiebertje> zie


Waar?

Toevoeging op 27/11/2015 09:22:26:

Jan de Laet op 27/11/2015 09:16:36:
Robert, ivm je witte pagina: dat betekent een fout, set error reporting eens aan.

Mogelijk zit het in gebruik van ' en " quotes in je sql.


Normaal geeft die errors al aan. Ik ben een beetje leek als het om sql gaat. PHP red ik me wel mee.
Gewijzigd op 27/11/2015 09:23:42 door Robbert Tromp
 
Jan de Laet

Jan de Laet

27/11/2015 09:44:05
Quote Anchor link
Robbert, laat de code met je sql eens zien zoals deze nu is
 
Robbert Tromp

Robbert Tromp

27/11/2015 10:13:45
Quote Anchor link
"$result = mysql_query("SELECT * FROM `reserveringen` ORDER BY datum, uur, lokaal DESC" and "SELECT * FROM reserveringen WHERE STR_TO_DATE(datum, "%d-%m-%Y") >= NOW()") or die(mysql_error());"
 
- Ariën  -
Beheerder

- Ariën -

27/11/2015 10:18:30
Quote Anchor link
Ik zou de queries niet met elkaar combineren, maar eerst eenmalig de UPDATE-query van Eddy uitvoeren met het tijdelijke veld.

Als dat goed gelukt is kan je daarna gewoon zonder STR_TO_DATE verder, omdat alle data dan in het juiste type staan.
 
Robbert Tromp

Robbert Tromp

27/11/2015 10:19:42
Quote Anchor link
Ja misschien wel zo slim Arien kost t wat meer tijd maar dan heb ik wel de juiste informatie.

Toevoeging op 27/11/2015 10:22:15:

En type direct omzetten naar DATE geeft vast problemen
Gewijzigd op 27/11/2015 10:19:56 door Robbert Tromp
 
- Ariën  -
Beheerder

- Ariën -

27/11/2015 10:26:25
Quote Anchor link
Jep, ongeldige formaat data wordt als 0000-00-00 opgeslagen namelijk.
Daarom ook de overstap naar een tijdelijk veld.

Offtopic:
Ik sloeg voeger ook de tijden als VARCHAR op, maar zonder een goed formaat aan te houden. Heeft enkele uren geduurd voordat ik alles recht kreeg naar DATETIME. Wel met een semi-automatisch script gelukkig ;-)
Gewijzigd op 27/11/2015 10:28:29 door - Ariën -
 
Robbert Tromp

Robbert Tromp

27/11/2015 10:38:23
Quote Anchor link
Dat zou wel de beste oplossing zijn dan, maar het moet toch ook gewoon mogelijk zijn met

"$result = mysql_query("SELECT * FROM `reserveringen` WHERE STR_TO_DATE(datum, "%d-%m-%Y") = NOW()") or die(mysql_error());"
 
- Ariën  -
Beheerder

- Ariën -

27/11/2015 11:12:13
Quote Anchor link
Dat zou naar mijn idee moeten kunnen.
Ik zou sowieso wel van de MySQL-functies afstappen omdat deze verouderd zijn, en bij voorkeur de MySQLi-functies gebruiken.
 
Jan de Laet

Jan de Laet

27/11/2015 11:27:06
Quote Anchor link
Met = NOW() zie je alleen de reserveringen van vandaag.
Je wilt waarschijnlijk >= NOW() gebruiken, kijkend naar je 1e vraag (vandaag of nieuwer).
 
Ivo P

Ivo P

27/11/2015 11:47:37
Quote Anchor link
STR_TO_DATE(datum, "%d-%m-%Y") = NOW()"

Dat zou er toe kunnen leiden dat je database eerste alle 31285 records in je database af moet om de string naar een date om te zetten, om vervolgens te kijken of er aan de voorwaarde > now() voldaan wordt.

Met een DATE is idie vergelijking gemakkelijker.
 
Ward van der Put
Moderator

Ward van der Put

27/11/2015 13:02:16
Quote Anchor link
Aangezien je al een uur INT(1) hebt voor het lesuur, zou ik een DATE gebruiken voor de datum. Een DATETIME of TIMESTAMP voegt dan niets toe.

Houd verder rekening met de querycache. Gebruik je in een query nondeterministic functies zoals NOW(), DATE(NOW()) of CURDATE(), dan moeten deze steeds worden geëvalueerd en kan de querycache niet worden gebruikt:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
SELECT ...
  FROM reserveringen
 WHERE datum >= CURDATE()


Met een literal value kan de querycache wél worden gebruikt, dus dit is een situatie waarin je vaak beter PHP de datum kunt laten invullen. Vooral als je dit doet met de huidige datum, kan na het uitvoeren van de query gedurende de rest van de dag de querycache veelvuldig worden benut:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
SELECT ...
  FROM reserveringen
 WHERE datum >= '2015-11-27'
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.