<< Tilbage

Dato og tid i MySQL

Hvilket format?

Når du gemmer tidspunkter/datoer i en MySQL database, så er det en god ide at bruge felttypen datetime. Datetime er MySQL's indbyggede tidsformat, og giver en masse muligheder for udvælgelse af poster. Derudover er formatet nemt at forstå når man browser sin database.

En datetime er defineret med følgende format: yyyy-mm-dd hh:mm:ss
Eksempelvis: 2006-07-30 18:30:00  (30 juni 2006 kl.18:30)

Indsætte dags dato

Herunder er et eksempel på hvordan der oprettes en ny post hvor feltet tid sættes til dags dato, samt hvor vi opdatere en post og sætter tid til dags dato

Kode:
1.
2.
3.
4.
<?php
mysql_query
("INSERT INTO mintabel (tid) VALUES (now())"); //Indsæt ny post med dags dato i feltet 'tid'
mysql_query("UPDATE mintabel SET tid=now() WHERE id='1'"); //Opdater en post med tid til dags dato, hvor id=1
?>

Vi bruger altså now() til at finde dags dato i datetime formatet (bemærk at der ikke skal ' tegn omkring).
Resultatet bliver følgende (mintabel):

+----+---------------------+
| id | tid                 |
+----+---------------------+
| 1  | 2006-06-15 21:30:15 |
+----+---------------------+

Formatering af datetime

Du kan hive indholdet af datetime feltet ud på almindelig vis (SELECT tid FROM mintabel), men er du låst fast med en streng i det originale format (yyyy-mm-dd hh:mm:ss). Man kan selvfølgelig også hive datoen ud præcis som man ønsker den. Til dette formål bruger vi den indbyggede funktion DATE_FORMAT(). Et eksempel:

Kode:
1.
2.
3.
<?php
mysql_query
("SELECT id, DATE_FORMAT(tid, '%d-%m%-%Y') AS tid FROM mintabel WHERE id='1'");
?>

Resultat:

+----+------------+
| id | tid        |
+----+------------+
|  1 | 15-06-2006 |
+----+------------+
Det første parameter i DATE_FORMAT fortæller hvilket datetime felt i databasen vi ønsker at formatere. Og det næste parameter er en streng der bestemmer selve formatet. Her bliver f.eks. %Y til 2006 og %d til 02.

Her er en tabel over de bogstaver man kan bruge til at få det ønskede format ud:

Tegn Beskrivelse  
%c Måned 1-12
%m Måned 00-12
%d Dag på måneden 01-31
%e Dag på måneden 1-31
%H Timer 00-23
%h Timer 01-12
%l Timer 1-12
%k Timer 0-23
%i Minutter 00-59
%j Dag på året 001-366
%s Sekunder 00-59
%v Uge på året 01-53
%w Ugedag (0=søndag, 6=lørdag) 0-6
%Y Årstal 2006
%y Årstal 06

Et eksempel mere:

Kode:
1.
2.
3.
<?php
mysql_query
("SELECT *, DATE_FORMAT(tid, '%d.%m.%Y %H:%i') AS nytid FROM mintabel WHERE id='1'");
?>

Resultat:

+----+---------------------+------------------+
| id | tid                 | nytid            |
+----+---------------------+------------------+
|  1 | 2006-06-15 21:00:15 | 15.06.2006 21:00 |
+----+---------------------+------------------+

..mere specifikt

Ovenstående måde at udvælge tiden på (som en streng) er god hvis man udelukkende skal kommunikere med brugeren. Men skal man lave nogle beregninger i sit php-script, så er det en fordel at hente de enkelte værdier (år, måned..) ud enkeltvis. Et eksempel på hvordan man kan gøre det:

Kode:
1.
2.
3.
4.
5.
6.
7.
8.
<?php
$q 
mysql_query("SELECT YEAR(tid) AS aar, MONTH(tid) AS maaned, DAY(tid) AS dag FROM mintabel WHERE id='1'");
$r mysql_fetch_array($q);

echo 
$r['aar'];
echo 
$r['maaned'];
echo 
$r['dag'];
?>

Resultat af forespørgslen:

+------+--------+------+
| aar  | maaned | dag  |
+------+--------+------+
| 2006 |      6 |    2 |
+------+--------+------+
Her bruger man altså fx YEAR(tid) til at finde årstallet på feltet tid. Andre muligheder for at udvælge:

Ord Beskrivelse  
YEAR Årstal 2006
QUARTER Kvartal 1-4
MONTH Måned 1-12
WEEK Uge på året 1-53
DAY Dag 1-31
HOUR Timer 0-23
MINUTE Minutter 0-59
SECOND Sekunder 0-59

Trække unix timestamp format ud

Man kan konvertere direkte fra datetime formatet til timestamp i MySQL. Det gøres vha. funktionen UNIX_TIMESTAMP(felt), eks.:

Kode:
1.
2.
3.
<?php
mysql_query
("SELECT UNIX_TIMESTAMP(tid) AS tid FROM mintabel WHERE id='1'");
?>

Resultat:

+----+------------+
| id | tid        |
+----+------------+
| 1  | 1149275897 |
+----+------------+

Datosøgninger

Det er fantastisk nemt at udvælge bestemte tidspunkter fra sin database, f.eks. alle poster med en dato fra en bestemt dag og et bestemt år. Et simpelt eksempel hvor årstaller skal være 2006 og måneden juni (måned 6):

Kode:
1.
2.
3.
<?php
mysql_query
("SELECT * FORM mintabel WHERE YEAR(tid)='2006' AND MONTH(tid)='6'");
?>

Resultat:

+----+---------------------+
| id | tid                 |
+----+---------------------+
|  1 | 2006-06-02 21:18:17 |
|  4 | 2006-06-10 17:19:11 |
|  5 | 2006-06-03 18:09:14 |
+----+---------------------+
Som man kan se er det lidt samme princip som i det sidste afsnit. YEAR(tid) giver årstallet af "tid" feltet, og det skal altså være lig 2006 i eksemplet.
Man kan også bruge større end og mindre end som med almindelig integer felter:

Kode:
1.
2.
3.
<?php
mysql_query
("SELECT * FROM mintabel WHERE YEAR(tid) > 2005 AND HOUR(tid) < 19");
?>

Resultat:

+----+---------------------+
| id | tid                 |
+----+---------------------+
| 1  | 2006-06-01 13:49:03 |
| 2  | 2006-06-15 18:55:14 |
| 4  | 2006-09-12 13:21:50 |
+----+---------------------+
Alle poster hvor årstallet af tid er større end 2005, og før kl. 19.

Sortering

Selvom datetime har formatet yyyy-mm-dd hh:mm:ss kan man sagtens sortere på samme måde som almindelig tal (dvs. vha. ORDER BY tidsfelt). Et eksempel med nyeste poster øverst:

Kode:
1.
2.
3.
<?php
mysql_query
("SELECT * FROM mintabel ORDER BY tid DESC");
?>

Resultat:

+----+---------------------+
| id | tid                 |
+----+---------------------+
| 4  | 2006-09-12 13:21:50 |
| 6  | 2006-06-03 14:43:49 |
| 1  | 2006-06-01 13:49:03 |
| 3  | 2006-05-15 23:12:28 |
| 5  | 2005-09-26 19:24:00 |
+----+---------------------+

Lægge tid til en dato

Forestil dig at du gerne vil have alle poster indenfor den sidste time. Eller du gerne vil finde ud af hvilket tidspunkt 45 minutter lagt til har. Til det formål kan vi bruge ADDDATE(), som laver en ny dato ud fra en anden dato, med et bestemt interval lagt til eller trukket fra. Her er nogle eksempler på brugen:

Kode:
1.
2.
3.
4.
5.
6.
7.
<?php
//Lægge tid til et datetime felt
mysql_query("SELECT *, ADDDATE(tid, INTERVAL 45 MINUTE) AS nytid FROM mintabel");

//Udvælge alle poster den sidste time
mysql_query("SELECT * FROM mintabel WHERE tid > ADDDATE(now(), INTERVAL -1 HOUR)");
?>

Det første argument fortæller hvilken datetime vi vil oprette den nye dato ud fra. Det andet argument bestemmer hvad vi vil trække fra eller lægge til (ved at skrive INTERVAL efterfulgt af et udtryk). I det første eksempel tager vi altså feltet 'tid' og lægger 45 minutter til. I det andet eksempel tager vi now() (dags dato) og trækker 1 time fra (ved at skrive minus foran 1 HOUR). Altså udvælger den de poster hvor 'tid' er større (>) end dags dato minus 1 time.

Leder du efter billige usb stik?, så kan du få et Billigt USB stik hos usb.dk

Spørgsmål/forslag/kommentarer rettes til webmaster@phpartikler.dk

Billige USB stik