Datumfuncties in MySQL
Een inleiding in de datum en tijd mogelijkheden van MySQL
Gesponsorde koppelingen
Inhoudsopgave
32 reacties op 'Datumfuncties in MySQL'
Gesponsorde koppelingen
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.
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.
@ 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:
@ 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:
Voorbeeld 7: Wie moet ik een verjaardagskaartje sturen?
die between 1 and 3 , is dat voor een verjaardagskaartje sturen naar iedereen die binnen 3 dagen verjaart?
Code (php)
1
2
3
4
5
6
7
8
9
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
";
?>
$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?
@ 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 :-)
Hoe kan hier nou voor zorgen dat hij er 7 uur bij optelt, omdat de server in amerika staat.
Of anders hoe kan ik er gewoon GM+1 tijd van maken?
Code (php)
1
2
3
4
5
6
7
8
9
10
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"];
//...
?>
//...
$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?
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
@ 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
@ 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.
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.
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
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:
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)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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>';
}
?>
$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>';
}
?>
Code (php)
1
2
3
2
3
<?
$weekdagnamen = array (zondag, maandag, dinsdag, woensdag, donderdag, vrijdag, zaterdag);
?>
$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)
1
2
3
2
3
<?
$weekdagnamen = array ('zondag', 'maandag', 'dinsdag', 'woensdag', 'donderdag', 'vrijdag', 'zaterdag');
?>
$weekdagnamen = array ('zondag', 'maandag', 'dinsdag', 'woensdag', 'donderdag', 'vrijdag', 'zaterdag');
?>
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
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;
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.
- Details
Door:
Jan Koehoorn- 8 jaar geleden
- 1.732 x bekeken
- Labels
- Geen tags toegevoegd.
- PHP tutorials opties
- Overig
- Nieuwste PHP tutorials
- PHP tutorial toevoegen


PHP hulp
0 seconden vanaf nu