Datumfuncties in MySQL

Door Jan Koehoorn, 23 jaar geleden, 10.638x bekeken

Een inleiding in de datum en tijd mogelijkheden van MySQL

Gesponsorde koppelingen

Inhoudsopgave

  1. Inleiding
  2. Datum- en tijdtypes
  3. Formats
  4. Nederlandse en Engelse notatie
  5. Rekenen met datums

 

Er zijn 32 reacties op 'Datumfuncties in mysql'

PHP hulp
PHP hulp
0 seconden vanaf nu
 

Gesponsorde koppelingen
Jelmer -
Jelmer -
23 jaar geleden
 
0 +1 -0 -1
Fijn dat hij als nog iss gepost.
Mooie duidelijke tutorial, zoals gewend. Alleen jammer dat je in voorbeeld 4 niet ook op de setlocale()-manier wijst, en dat je gebruik maakt van fetch_object. Fetch_assoc is bij mijn weten sneller, en naar mijn mening overzichtelijker. IMO haal je data uit een array, en functies uit een object.


23 jaar geleden
 
0 +1 -0 -1
Deze is beter dan de vorige :)
Misschien is het ook wel handig om te vertellen hoe je toch van een uit-de-db-getrekte-tijd een timestamp kan maken.
Jasper
jasper
23 jaar geleden
 
0 +1 -0 -1
en hoe zet ik nu bijvoorbeeld een geboortedatum in met DATETIME in een tabel ? want dit is voor mij het grootste beperkingsprobleem met die timestamp van php vanaf 1970, vermits er vele mensen die nog steeds leven voor deze datum geboren zijn!
Jan Koehoorn
Jan Koehoorn
23 jaar geleden
 
0 +1 -0 -1
@ Jelmer: die setlocale had ik wel in de vorige versie. Ik zal hem er even bij zetten. Performance-verschillen in mysql_fetch_object, mysql_fetch_array en mysql_fetch_assoc zijn bij mijn weten te verwaarlozen. Ik hou niet zo erg van quotes zoals je weet, dus dan schrijf ik liever ->

@ Sebastiaan: thanks. Ik kan het er best bij zetten, maar zoals ik vorige keer ook zei, wil ik juist graag dat men zich meer in de (uitgebreidere) datum- en tijdfuncties van MySQL gaat verdiepen.

@ Jasper: bijvoorbeeld zo:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
<?php
  // geboortedatum in een tabel zetten
  // in dit voorbeeld 11 mei 1930, 's ochtends half tien

  $sql = "
    INSERT INTO tabel
    (geboortedatum)
    VALUES
    ('1930-05-11 09:30:00')
    "
;
?>
Jasper
jasper
23 jaar geleden
 
0 +1 -0 -1
danku Jan, hier kan ik wel even wat zaken met verbeteren!
Jan Koehoorn
Jan Koehoorn
23 jaar geleden
 
0 +1 -0 -1
@ Jasper: graag gedaan :-)

@ Jelmer en Sebastiaan: jullie tips zijn verwerkt.
Marien xD
Marien xD
23 jaar geleden
 
0 +1 -0 -1
Nice tut Jan, keep on going :)

Enkele dingetjes gebruikte ik wel eens, maar zo goed was ik nog niet in MySQL
Han eev
Han eev
23 jaar geleden
 
0 +1 -0 -1
Een een Nice tut idd ;)

Erg handig =)

Han
Hipska BE
Hipska BE
23 jaar geleden
 
0 +1 -0 -1
Voorbeeld 7: Wie moet ik een verjaardagskaartje sturen?

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
<?php
  $sql
= "
    SELECT
    naam,
    DATE_FORMAT(geboortedatum, '%d') AS datum
    FROM kennissen
    WHERE (geboortedatum - NOW()) BETWEEN 1 AND 3
    "
;
?>


die between 1 and 3 , is dat voor een verjaardagskaartje sturen naar iedereen die binnen 3 dagen verjaart?
Jan Koehoorn
Jan Koehoorn
23 jaar geleden
 
0 +1 -0 -1
@ Hipska: niet helemaal. Voor ieder die morgen, overmorgen, of overovermorgen jarig is. Maar ik zie nu dat die code niet klopt. Ik bereken namelijk het verschil tussen iemands geboortedatum en nu, en dat geeft een heel ander getal. Ik ga ff uitzoeken hoe ik die query aan kan passen zodat hij klopt :-)
PurpleMadness -
PurpleMadness -
23 jaar geleden
 
0 +1 -0 -1
ik heb dus een laatste keer online script, maar hoe wil ik dat aanpakken om te laten zien of hij vandaag online is geweest?
ik zat te denken aan dit:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
$sql
"SELECT gebruikersnaam, DATE_FORMAT(last_online, '%d') FROM leden WHERE last_online = NOW('%d')";
?>

is dat goed?
Jan Koehoorn
Jan Koehoorn
23 jaar geleden
 
0 +1 -0 -1
@ PurpleMadness
Als je alleen %d doet, krijg je de datum, maar dan zou hij ook dezelfde datum uit vorige maanden selecteren. Beter zo:

SELECT
gebruikersnaam
FROM leden
WHERE
DATE_FORMAT(last_online, '%Y-%m-%d') = CURDATE()
Kalle P
Kalle P
23 jaar geleden
 
0 +1 -0 -1
Hoe kan hier nou voor zorgen dat hij er 7 uur bij optelt, omdat de server in amerika staat.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
<?php
//...
$getEntriesQuery = mysql_query("SELECT *, date_format(dateandtime, '%d-%m-%Y') as date, date_format(dateandtime, '%H:%i:%s') as time FROM ".$tableprefix."messages ORDER BY id DESC LIMIT ".$start.", ".$messagesPerPage) or die("<p><b>Database Error:</b></p><p>".mysql_error()."</p>");

    while ($getEntriesArray = mysql_fetch_array($getEntriesQuery))
    {

    $date = $getEntriesArray["date"];
    $time = $getEntriesArray["time"];
//...
?>


Of anders hoe kan ik er gewoon GM+1 tijd van maken?


23 jaar geleden
 
0 +1 -0 -1
Handig maak er meteen gebruik van!
PurpleMadness -
PurpleMadness -
23 jaar geleden
 
0 +1 -0 -1
Jan Koehoorn schreef op 07.12.2005 15:23
@ PurpleMadness
Als je alleen %d doet, krijg je de datum, maar dan zou hij ook dezelfde datum uit vorige maanden selecteren. Beter zo:

SELECT
gebruikersnaam
FROM leden
WHERE
DATE_FORMAT(last_online, '%Y-%m-%d') = CURDATE()


Bedankt =D
Ga et gelijk gebruiken :P
Jan Koehoorn
Jan Koehoorn
23 jaar geleden
 
0 +1 -0 -1
@ Kalle:

SELECT
*,
DATE_FORMAT(DATE_ADD(dateandtime, INTERVAL 7 HOUR), '%d-%m-%Y') as date,
DATE_FORMAT(DATE_ADD(dateandtime, INTERVAL 7 HOUR), '%H:%i:%s') as time
FROM ".$tableprefix."messages

Let op dat je ook bij het eerste DATE_FORMAT die 7 uur er bij optelt. De datum kan namelijk veranderen als je er 7 uur bij optelt.
Kalle P
Kalle P
23 jaar geleden
 
0 +1 -0 -1
Ok ik ga het proberen bedankt
Kalle P
Kalle P
23 jaar geleden
 
0 +1 -0 -1
Jan als ik die daarvoor inde plaats zet krijg ik een error. Of is het niet de bedoeling om het te vervangen?
Jan Koehoorn
Jan Koehoorn
23 jaar geleden
 
0 +1 -0 -1
@ Kalle: het kan zijn dat je moet rommelen met die ".$tableprefix."messages.
Het bovenste deel van die query moet goed zijn, want die heb ik gecheckt.
Remco van Arkelen
Remco van Arkelen
23 jaar geleden
 
0 +1 -0 -1
Quote:
Als je dus graag dingen wilt laten zien als "vrijdag 11 mei 2006" moet je twee arrays aanmaken met weekdagnamen en maandnamen.


Zulks kan ook binnen je query, voor de liefhebbers:

SELECT
CONCAT(
ELT( WEEKDAY(kolommetdatum)+1 , 'maandag ', 'dinsdag ',
'woensdag ', 'donderdag',
'vrijdag ', 'zaterdag ', 'zondag '
),
DAYOFMONTH( kolommetdatum) , ' ',
ELT( MONTH(kolommetdatum), 'januari', 'februari', 'maart',
'april', 'mei', 'juni', 'juli',
'augustus',
'september', 'oktober', 'november',
'december'
),
DATE_FORMAT( kolommetdatum, 'Y om %h:%i')
) AS datumlang
FROM tabelnaam
Jan Koehoorn
Jan Koehoorn
23 jaar geleden
 
0 +1 -0 -1
Tjonge, dat is me nogal een query :-) Het is mooi dat het zo ook kan, dat wist ik niet, maar die arrays in PHP zijn voor veel mensen misschien overzichtelijker. In ieder geval bedankt voor de tip, Remco.
Kalle P
Kalle P
23 jaar geleden
 
0 +1 -0 -1
Jan, ik heb een andere database gemaakt opnieuw ge?nstalleerd (het gastenboek), en toen zetten ik dat stukje code van jou erin en nu geeft ie de goede tijd aan.
Hartstikke bedankt.
Jan Koehoorn
Jan Koehoorn
23 jaar geleden
 
0 +1 -0 -1
@ Kalle: graag gedaan hoor :-)
Crispijn -
Crispijn -
22 jaar geleden
 
0 +1 -0 -1
Voor de oplettende lezers. Er staat een foutje bij de nederlandse datum

regel 8

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
DATE_FORMAT(datumtijdveld, ''%d) AS datum,
?>


dat moet worden

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
DATE_FORMAT(datumtijdveld, '%d') AS datum,
?>


Toch even handig als je 't weet voordat je domweg copy paste ;)
Jan Koehoorn
Jan Koehoorn
22 jaar geleden
 
0 +1 -0 -1
@Crispijn: is inmiddels hersteld.
Mar kla
mar kla
22 jaar geleden
 
0 +1 -0 -1
Goeie tutorial Jan.

Nu snap ik het eindelijk
Allen nog even een lijst met alle opties er bij en hij is echt compleet
Gifo
Gifo
21 jaar geleden
 
0 +1 -0 -1
Ik krijg de volgende foutmelding als ik de Nederlandse datum wil laten zien:

Notice: Use of undefined constant zondag - assumed 'zondag' in c:\program files\easyphp1-7\www\events_latest_lima.php on line 6

En dit geldt dan voor alle dagen en voor alle maanden.

Ik heb de code gekopieerd:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?php

  $weekdagnamen
= array (zondag, maandag, dinsdag, woensdag, donderdag, vrijdag, zaterdag);
  $maandnamen = array (1 => januari, februari, maart, april, mei, juni, juli, augustus, september, oktober, november, december);

  $sql = "
  SELECT DATE_FORMAT(publish_up, '%w') AS dag,
  DATE_FORMAT(publish_up, '%d') AS datum,
  DATE_FORMAT(publish_up, '%c') AS maand,
  DATE_FORMAT(publish_up, '%Y') AS jaar
  FROM events "
;
  $res = mysql_query ($sql) or die (mysql_error ());

  while ($obj = mysql_fetch_object ($res)) {
    echo '<p>' . $weekdagnamen[$obj->dag] . ' ' . $obj->datum . ' ' . $maandnamen[$obj->maand] . ' ' . $obj->jaar . '</p>';
  }

?>
Frank -
Frank -
21 jaar geleden
 
0 +1 -0 -1
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?
$weekdagnamen
= array (zondag, maandag, dinsdag, woensdag, donderdag, vrijdag, zaterdag);
?>

En waar zijn de quotes? Een string blijft een string en die hoort tussen quotes te staan ook als deze string in een array staat:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?
$weekdagnamen
= array ('zondag', 'maandag', 'dinsdag', 'woensdag', 'donderdag', 'vrijdag', 'zaterdag');
?>
Gifo
Gifo
21 jaar geleden
 
0 +1 -0 -1
Bedankt
Franklin
Franklin
21 jaar geleden
 
0 +1 -0 -1
Misschien is dit al eerder gevraagd, excuses in dat geval:

Als ik op mijn indexpagina's historische gebeurtenissen wil weergeven (bijvoorbeeld: "vandaag, 112 jaar geleden... geboorte van Jan Janssen".

Hoe kan ik dat dan doen?
Ericbruggema x
ericbruggema x
20 jaar geleden
 
0 +1 -0 -1
Ik wil wel eens weten hoe je snel met een datetime formaat de volgende gegevens kunt uitlezen.

Uren (0/23)
Huidige week
Vorige week
Laatste 2 weken (vanaf deze week)
Huidige maand
Vorige maand
Laatste kwartaal
Laatste halfjaar

en ga zo maar door :{ tis best pittig werken met datums in MySQL
PHP hulp
PHP hulp
0 seconden vanaf nu
 

Gesponsorde koppelingen
Frank -
Frank -
20 jaar geleden
 
0 +1 -0 -1
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
SELECT HOUR(NOW()) AS uur;
SELECT WEEK(NOW()) AS weeknummer;
SELECT WEEK(NOW()) - INTERVAL 1 WEEK AS weeknummer;
SELECT
  *
FROM
  tabelnaam
WHERE
  WEEK(datumtijd) > WEEK(CURRENT_DATE) - 2 WEEK;
SELECT MONTH(NOW()) AS maand;
SELECT MONTH(NOW()) - INTERVAL 1 MONTH AS maand;
SELECT
  *
FROM
  tabelnaam
WHERE
  QUARTER(datumtijd) > QUARTER(CURRENT_DATE) - 1 QUARTER;
SELECT
  *
FROM
  tabelnaam
WHERE
  MONTH(datumtijd) > MONTH(CURRENT_DATE) - 6 MONTH;

En hier zijn nog vele, vele varianten op mogelijk. Desondanks is het allemaal bijzonder simpel, noem het beestje bij de naam en maak een vergelijking.

Ga NOOIT maar dan ook NOOIT klooien met de idiote functie DATE_ADD, DATE_SUB, etc., maar gebruik gewoon een + of - samen met een INTERVAL. Dat is vele malen eenvoudiger!

In PostgreSQL is er ook een datatype INTERVAL, daar kun je nog veel meer mee doen.

Om te reageren heb je een account nodig en je moet ingelogd zijn.

Inhoudsopgave

  1. Inleiding
  2. Datum- en tijdtypes
  3. Formats
  4. Nederlandse en Engelse notatie
  5. Rekenen met datums

Labels

  • Geen tags toegevoegd.

PHP tutorial opties

 
 

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.