Datums en tijden opslaan in een MySQL database

Er zijn verschillende manieren om datums op te slaan in een MySQL database. Je kunt een Unix tijd als integer opslaan of gebruiken maken van het DATETIME datatype. Unix tijd is het aantal seconden geteld sinds 1 januari 1970 middernacht. DATETIME wordt verkregen en ingegeven in het formaat YYYY-MM-DD HH:MM:SS.

Beide manieren hebben zo hun voor- en nadelen. Wil je eerdere datums dan 1 januari 1970 opslaan, zal je DATETIME moeten gebruiken. DATETIME ondersteund datums vanaf '1000-01-01 00:00:00' tot '9999-12-31 23:59:59'. Het voordeel van de "integer methode" is de snelle werking. Je kan rechtstreeks php functies op de tijdinteger laten werken, zonder eerst nog een mktime() functie te hoeven gebruiken om van de, uit de MySQL database verkregen, leesbare datum een werkbare datum - Unix time - te maken. Je kan via SQL kiezen om een unix tijd te retourneren op volgende manier:

SELECT UNIX_TIMESTAMP( date ) AS unix_date FROM blog;

Dit is vooral handig als je een datum wilt formatteren met date() met maandnamen in je eigen taal. PHP kan in verschillende talen datums weergeven, MySQL alleen in het Engels.

MySQL heeft enkele datum en tijd functies om op je DATETIME velden los te laten. Deze hebben als voordeel dat je met al geoptimaliseerde data kunt werken in je php code.

Een voorbeeld: Verkrijg een overzicht van welke maanden er in je tabel zitten en formatteer ze als "Month name Year".

mysql> SELECT DATE_FORMAT( date, '%M %Y' )
    -> FROM blog
    -> GROUP BY YEAR( date ) , MONTH( date );
+------------------------------+
| DATE_FORMAT( date, '%M %Y' ) |
+------------------------------+
|                              |
| July 1949                    |
| March 1995                   |
| February 2006                |
| July 2006                    |
+------------------------------+

Iets wat misschien minder belangrijk is maar waar je toch in sommige gevallen op moet letten, de tijdszone. MySQL ondersteund op dit moment jammer genoeg nog geen mogelijkheid om de tijdszone mee op te slaan in je database. Wel heeft MySQL enkele functies voorzien die al wat hulp bieden.

Voorbeeld: Converteer een tijd van de ene tijdzone naar de andere

mysql> SELECT CONVERT_TZ('2004-01-01 12:00:00','+00:00','+10:00');
    -> '2004-01-01 22:00:00'

Wil je rekening houden met tijdszones kan je best een veld bijmaken waar je de UTC of de tijdszone in opslaat. Met UTC_TIME() kan je de Greenwich mean time verkrijgen.

Als je site op meerdere webservers draait en je een datum via de php functie time() stockeerd kunnen er problemen kunnen ontstaan als beide servers een andere tijd ingesteld hebben. Als je MySQL database op 1 server draait is het verstandiger om je datums via een MySQL functie (bijvoorbeeld NOW()) op te slaan.

Update: Op Scriptorama is er een artikel verschenen met nog enkele voorbeelden hoe je kunt werken met datums.

Meer informatie vind je op:

Gepost: 2006-07-27 17u17


Gelijkaardige posts


Reacties

Er werd nog niet gereageerd.

Plaats een reactie

*Velden verplicht in te vullen.
E-mail wordt niet gepubliceerd.
Uw reactie wordt pas zichtbaar als deze goedgekeurd wordt door de eigenaar van deze blog.
Wanneer u een reactie plaatst, wordt er een cookie opgeslagen.