Fonctions numériques
<<<
Fonctions de dates et d'heures Recherche en texte intégral ( Full-text ) dans MySQL
>>>

13 Fonctions à utiliser dans les clauses SELECT et WHERE
 Manuel de Référence MySQL 4.1 : Version Française

Opérateurs et fonctions tous types
Les fonctions de contrôle
Fonctions de chaînes de caractères
Fonctions numériques
->Fonctions de dates et d'heures
Recherche en texte intégral ( Full-text ) dans MySQL
Fonctions de transtypage
Autres fonctions
Fonctions et options à utiliser dans les clauses GROUP BY

13.5 Fonctions de dates et d'heures

Cette section décrit les fonctions qui peuvent être utilisées pour manipuler les valeurs temporelles. Voir Types temporels pour une description détaillée des intervalles de validité de chaque type, ainsi que les formats valides de spécifications des dates et heures.

Voici un exemple d'utilisation des fonctions de date. La requête suivante sélectionne toutes les lignes dont la colonne date_col représente une date de moins de 30 jours :

mysql> SELECT quelquechose FROM nom_de_table
           WHERE TO_DAYS(NOW()) - TO_DAYS(date_col) <= 30;
Notez que cette requête va aussi sélectionner des lignes dont les dates sont dans le futur.Les fonctions qui utilisent des valeurs de date acceptent les valeurs de type DATETIME et ignore la partie horaire. Les fonctions qui attendent des heures acceptent les valeurs littérales et ignorent la partie de date.

Les fonctions qui retourne la date ou l'heure courante sont évaluées une fois par requête, tout au début. Cela signifie que des références multiples à la fonction NOW() dans une même requête produiront toujours le même résultat. Ce principe s'applique aussi à CURDATE() , CURTIME() , UTC_DATE() , UTC_TIME() , UTC_TIMESTAMP() , et leurs synonymes.

Les intervalles de valeurs de retour des fonctions suivantes s'appliquent aux dates complètes. Si une date est une valeur ``zéro'' ou une date incomplète, comme '2001-11-00' , les fonctions qui extraient une partie d'une date retourneront 0 . Par exemple, DAYOFMONTH('2001-11-00') retourne 0 .
    ADDDATE(date,INTERVAL expr type)
    ADDDATE(expr,days)
    Lorsqu'elle est utilisée avec la forme INTERVAL , ADDDATE() est un synonyme de DATE_ADD() . La fonction complémentaire SUBDATE() est un synonyme DATE_SUB() .
    
    mysql> SELECT DATE_ADD('1998-01-02', INTERVAL 31 DAY);
            -> '1998-02-02'
    mysql> SELECT ADDDATE('1998-01-02', INTERVAL 31 DAY);
            -> '1998-02-02'
    Depuis MySQL 4.1.1, la seconde syntaxe est utilisée si expr est une expression de type DATE ou DATETIME , et que days est un nombre de jour à ajouter à expr .
    
    mysql> SELECT ADDDATE('1998-01-02', 31);
            -> '1998-02-02'
    ADDTIME(expr,expr2)

    ADDTIME() ajoute expr2 à expr et retourne le résultat. expr est une expression de type DATE ou DATETIME , et expr2 est une expression de type TIME .

    
    mysql> SELECT ADDTIME("1997-12-31 23:59:59.999999", "1 1:1:1.000002");
            -> '1998-01-02 01:01:01.000001'
    mysql> SELECT ADDTIME("01:00:00.999999", "02:00:00.999998");
            -> '03:00:01.999997'
    ADDTIME() a été ajouté en MySQL 4.1.1.

    CURDATE()
    CURRENT_DATE
    Retourne la date courante au format 'YYYY-MM-DD' ou YYYYMMDD , suivant le contexte numérique ou chaîne :
    
    mysql> SELECT CURDATE();
            -> '1997-12-15'
    mysql> SELECT CURDATE() + 0;
            -> 19971215
    CURRENT_DATE
    CURRENT_DATE()
    CURRENT_DATE et CURRENT_DATE() sont synonymes de CURDATE() .

    CURTIME()
    Retourne l'heure courante au format 'HH:MM:SS' or HHMMSS suivant le contexte numérique ou chaîne :
    
    mysql> SELECT CURTIME();
            -> '23:50:26'
    mysql> SELECT CURTIME() + 0;
            -> 235026
    CURRENT_TIME
    CURRENT_TIME()
    CURRENT_TIME et CURRENT_TIME() sont synonymes de CURTIME() .

    CURRENT_TIMESTAMP
    CURRENT_TIMESTAMP()
    CURRENT_TIMESTAMP et CURRENT_TIMESTAMP() sont synonymes de NOW() .

    DATE(expr)
    Extrait la partie date de l'expression expr de type DATE ou DATETIME .
    
    mysql> SELECT DATE('2003-12-31 01:02:03');
            -> '2003-12-31'
    DATE() est disponible depuis MySQL 4.1.1.
    DATEDIFF(expr,expr2)
    DATEDIFF() retourne le nombre de jours entre la date de début expr et la date de fin expr2 . expr et expr2 sont des expressions de type DATE ou DATETIME . Seule la partie DATE est utilisée dans le calcul.
    
    mysql> SELECT DATEDIFF('1997-12-31 23:59:59','1997-12-30');
            -> 1
    mysql> SELECT DATEDIFF('1997-11-31 23:59:59','1997-12-31');
            -> -30
    DATEDIFF() est disponible depuis MySQL 4.1.1.
    DATE_ADD(date,INTERVAL expr type)
    DATE_SUB(date,INTERVAL expr type)
    Ces fonctions effectuent des calculs arithmétiques sur les dates.Depuis MySQL 3.23, INTERVAL expr type est autorisé des deux cotés de l'opérateur + si l'expression de l'autre coté est de type DATE ou DATETIME . Pour l'opérateur - , INTERVAL expr type est autorisé uniquement du coté droit, car on ne peut pas soustraire une date d'un intervalle (voir les exemples ci-dessous).

    date est une valeur de type DATETIME ou DATE qui spécifie la date de début. expr est une expression qui spécifie une valeur d'intervalle à ajouter ou soustraire de la date initiale. expr est une chaîne : elle peut commencer avec '-' pour les intervalles négatifs. type est un mot-clé, indiquant comment l'expression doit être interprétée.

    La table suivante indique la signification des arguments type et expr :
    type Valeur Attendue expr Format
    MICROSECOND MICROSECONDS
    SECOND SECONDS
    MINUTE MINUTES
    HOUR HOURS
    DAY DAYS
    WEEK WEEKS
    MONTH MONTHS
    QUARTER QUARTERS
    YEAR YEARS
    SECOND_MICROSECOND 'SECONDS.MICROSECONDS'
    MINUTE_MICROSECOND 'MINUTES.MICROSECONDS'
    MINUTE_SECOND 'MINUTES:SECONDS'
    HOUR_MICROSECOND 'HOURS.MICROSECONDS'
    HOUR_SECOND 'HOURS:MINUTES:SECONDS'
    HOUR_MINUTE 'HOURS:MINUTES'
    DAY_MICROSECOND 'DAYS.MICROSECONDS'
    DAY_SECOND 'DAYS HOURS:MINUTES:SECONDS'
    DAY_MINUTE 'DAYS HOURS:MINUTES'
    DAY_HOUR 'DAYS HOURS'
    YEAR_MONTH 'YEARS-MONTHS'
    Les valeurs de type DAY_MICROSECOND , HOUR_MICROSECOND , MINUTE_MICROSECOND , SECOND_MICROSECOND , et MICROSECOND ont été ajoutés en MySQL 4.1.1. Les valeurs QUARTER et WEEK sont disponibles depuis MySQL 5.0.0.

    MySQL autorise tous les signes de ponctuation, comme délimiteur dans le format de expr . Ceux qui sont affichés dans la table sont des suggestions. Si l'argument date est une valeur DATE et que vos calculs impliquent des parties YEAR , MONTH et DAY (c'est à dire, sans partie horaire), le résultat sera de type DATE . Sinon, le résultat est de type DATETIME :

    
    mysql> SELECT '1997-12-31 23:59:59' + INTERVAL 1 SECOND;
            -> '1998-01-01 00:00:00'
    mysql> SELECT INTERVAL 1 DAY + '1997-12-31';
            -> '1998-01-01'
    mysql> SELECT '1998-01-01' - INTERVAL 1 SECOND;
            -> '1997-12-31 23:59:59'
    mysql> SELECT DATE_ADD('1997-12-31 23:59:59',
        ->                 INTERVAL 1 SECOND);
            -> '1998-01-01 00:00:00'
    mysql> SELECT DATE_ADD('1997-12-31 23:59:59',
        ->                 INTERVAL 1 DAY);
            -> '1998-01-01 23:59:59'
    mysql> SELECT DATE_ADD('1997-12-31 23:59:59',
        ->                 INTERVAL '1:1' MINUTE_SECOND);
            -> '1998-01-01 00:01:00'
    mysql> SELECT DATE_SUB('1998-01-01 00:00:00',
        ->                 INTERVAL '1 1:1:1' DAY_SECOND);
            -> '1997-12-30 22:58:59'
    mysql> SELECT DATE_ADD('1998-01-01 00:00:00',
        ->                 INTERVAL '-1 10' DAY_HOUR);
            -> '1997-12-30 14:00:00'
    mysql> SELECT DATE_SUB('1998-01-02', INTERVAL 31 DAY);
            -> '1997-12-02'
    mysql> SELECT DATE_ADD('1992-12-31 23:59:59.000002',
        ->                 INTERVAL '1.999999' SECOND_MICROSECOND);
            -> '1993-01-01 00:00:01.000001'
    Si vous spécifiez un intervalle qui est trop court (il n'inclut pas toutes les parties d'intervalle attendues par type ), MySQL suppose que vous avez omis les valeurs de gauche. Par exemple, si vous spécifiez un type type de DAY_SECOND , la valeur expr devrait contenir des jours, heures, minutes et secondes. Si vous fournissez une valeur de la forme '1:10' , MySQL suppose que les jours et heures manquent, et que la valeur représente des minutes et secondes. En d'autres termes, '1:10' DAY_SECOND est interprété comme '1:10' MINUTE_SECOND . C'est similaire au comportement de MySQL avec les valeurs de type TIME , qui représente des durées plutôt que des horaires.

    Notez que si vous ajoutez ou soustrayez à une valeur de type DATE des horaires, le résultat sera automatiquement au format DATETIME :

    
    mysql> SELECT DATE_ADD('1999-01-01', INTERVAL 1 DAY);
            -> '1999-01-02'
    mysql> SELECT DATE_ADD('1999-01-01', INTERVAL 1 HOUR);
            -> '1999-01-01 01:00:00'
    Si vous utilisez des dates malformées, le résultat sera NULL . Si vous ajoutez des MONTH , YEAR_MONTH ou YEAR , et que le résultat a un jour du mois qui est au-delà de ce qui est possible dans le mois, le jour sera adapté au plus grand jour possible du mois. Par exemple :
    
    mysql> SELECT DATE_ADD('1998-01-30', interval 1 month);
            -> '1998-02-28'
    Notez que dans l'exemple précédent, le mot clé INTERVAL et le spécificateur type sont insensibles à la casse.
    DATE_FORMAT(date,format)
    Formate la date date avec le format format . Les spécificateurs suivants peuvent être utilisé dans la chaîne format :
    Option Description
    %% Un signe pourcentage littéral '%' .
    %a Nom du jour de la semaine, en abrégé et en anglais ( Sun .. Sat )
    %b Nom du mois, en abrégé et en anglais ( Jan .. Dec )
    %c Mois, au format numérique ( 1 .. 12 )
    %d Jour du mois, au format numérique ( 00 .. 31 )
    %D Jour du mois, avec un suffixe anglais ( 1st , 2nd , 3rd , etc.)
    %e Jour du mois, au format numérique ( 0 .. 31 )
    %f Microsecondes ( 000000 .. 999999 )
    %H Heure ( 00 .. 23 )
    %h Heure ( 01 .. 12 )
    %I Heure ( 01 .. 12 )
    %i Minutes, au format numérique ( 00 .. 59 )
    %j Jour de l'année ( 001 .. 366 )
    %k Heure ( 0 .. 23 )
    %l Heure ( 1 .. 12 )
    %m Mois, au format numérique ( 01 .. 12 )
    %M Nom du mois ( January .. December )
    %p AM ou PM
    %r Heures, au format 12 heures ( hh:mm:ss [AP]M )
    %s Secondes ( 00 .. 59 )
    %S Secondes ( 00 .. 59 )
    %T Heures, au format 24 heures ( hh:mm:ss )
    %U Numéro de la semaine ( 00 .. 53 ), où Dimanche est le premier jour de la semaine
    %u Numéro de la semaine ( 00 .. 53 ), où Lundi est le premier jour de la semaine
    %V Numéro de la semaine ( 01 .. 53 ), où Dimanche est le premier jour de la semaine, utilisé avec '%X'
    %v Numéro de la semaine ( 01 .. 53 ), où Lundi est le premier jour de la semaine, utilisé avec '%x'
    %W Nom du jour de la semaine ( Sunday .. Saturday )
    %w Numéro du jour de la semaine ( 0 =Sunday.. 6 =Saturday)
    %X Année, pour les semaines qui commencent le Dimanche, au format numérique, sur 4 chiffres, utilisé avec '%V'
    %x Année, pour les semaines qui commencent le Lundi, au format numérique, sur 4 chiffres, utilisé avec '%v'
    %y Année, au format numérique, sur 2 chiffres
    %Y Année, au format numérique, sur 4 chiffres

    Tous les autres caractères sont simplement copiés dans le résultat sans interprétation:

    Le format %f est disponible depuis MySQL 4.1.1.

    Depuis MySQL version 3.23, le caractère '%' est requis devant les caractères de format. Dans les versions antérieures de MySQL, '%' était optionnel.

    La raison qui fait que les intervalles de mois et de jours commencent avec zéro est que MySQL autorise les dates incomplètes comme '2004-00-00' , depuis MySQL 3.23.
    
    mysql> SELECT DATE_FORMAT('1997-10-04 22:23:00', '%W %M %Y');
            -> 'Saturday October 1997'
    mysql> SELECT DATE_FORMAT('1997-10-04 22:23:00', '%H:%i:%s');
            -> '22:23:00'
    mysql> SELECT DATE_FORMAT('1997-10-04 22:23:00',
                              '%D %y %a %d %m %b %j');
            -> '4th 97 Sat 04 10 Oct 277'
    mysql> SELECT DATE_FORMAT('1997-10-04 22:23:00',
                              '%H %k %I %r %T %S %w');
            -> '22 22 10 10:23:00 PM 22:23:00 00 6'
    mysql> SELECT DATE_FORMAT('1999-01-01', '%X %V');
            -> '1998 52'
    DAY(date)
    DAY() est un synonyme de DAYOFMONTH() . Cette fonction est disponible depuis MySQL 4.1.1.

    DAYNAME(date)
    Retourne le nom du jour de la semaine de date :
    
    mysql> SELECT DAYNAME('1998-02-05');
            -> 'Thursday'
    DAYOFMONTH(date)
    Retourne le jour de la date date , dans un intervalle de 1 à 31 :
    
    mysql> SELECT DAYOFMONTH('1998-02-03');
            -> 3
    DAYOFWEEK(date)
    Retourne l'index du jour de la semaine : pour date ( 1 = Dimanche, 2 = Lundi, ... 7 = Samedi). Ces index correspondent au standard ODBC :
    
    mysql> SELECT DAYOFWEEK('1998-02-03');
            -> 3
    DAYOFYEAR(date)
    Retourne le jour de la date date , dans un intervalle de 1 à 366 :
    
    mysql> SELECT DAYOFYEAR('1998-02-03');
            -> 34
    EXTRACT(type FROM date)
    La fonction EXTRACT() utilise les mêmes types d'intervalles que la fonction DATE_ADD() ou la fonction DATE_SUB() , mais extrait des parties de date plutôt que des opérations de date.
    
    mysql> SELECT EXTRACT(YEAR FROM "1999-07-02");
           -> 1999
    mysql> SELECT EXTRACT(YEAR_MONTH FROM "1999-07-02 01:02:03");
           -> 199907
    mysql> SELECT EXTRACT(DAY_MINUTE FROM "1999-07-02 01:02:03");
           -> 20102
    mysql> SELECT EXTRACT(MICROSECOND FROM "2003-01-02 10:30:00.00123");
            -> 123
    FROM_DAYS(N)
    Retourne la date correspondant au nombre de jours ( N ) depuis la date 0 :
    
    mysql> SELECT FROM_DAYS(729669);
            -> '1997-10-07'
    FROM_DAYS() n'est pas fait pour travailler avec des dates qui précèdent l'avènement du calendrier Grégorien (1582), car elle ne prend pas en compte les jours perdus lors du changement de calendrier.
    FROM_UNIXTIME(unix_timestamp)
    Retourne une représentation de l'argument unix_timestamp sous la forme 'YYYY-MM-DD HH:MM:SS' ou YYYYMMDDHHMMSS , suivant si la fonction est utilisé dans un contexte numérique ou de chaîne.
    
    mysql> SELECT FROM_UNIXTIME(875996580);
            -> '1997-10-04 22:23:00'
    mysql> SELECT FROM_UNIXTIME(875996580) + 0;
            -> 19971004222300
    Si format est donné, le résultat est formaté en fonction de la chaîne format . format peut contenir les mêmes options de format que celles utilisées par DATE_FORMAT() :
    
    mysql> SELECT FROM_UNIXTIME(UNIX_TIMESTAMP(),
        ->                      '%Y %D %M %h:%i:%s %x');
            -> '2003 6th August 06:22:58 2003'
    GET_FORMAT(DATE | TIME | TIMESTAMP, 'EUR' | 'USA' | 'JIS' | 'ISO' | 'INTERNAL')
    Retourne une chaîne de format. Cette fonction est pratique lorsqu'elle est utilisée avec les fonctions DATE_FORMAT() et STR_TO_DATE() . Les trois valeurs possibles pour le premier argument, et les cinq valeurs possible pour le second argument donnent 15 formats d'affichage (pour les options utilisées, voyez la table de la fonction DATE_FORMAT() ) :
    Appel fonction Résultat
    GET_FORMAT(DATE,'USA') '%m.%d.%Y'
    GET_FORMAT(DATE,'JIS') '%Y-%m-%d'
    GET_FORMAT(DATE,'ISO') '%Y-%m-%d'
    GET_FORMAT(DATE,'EUR') '%d.%m.%Y'
    GET_FORMAT(DATE,'INTERNAL') '%Y%m%d'
    GET_FORMAT(TIMESTAMP,'USA') '%Y-%m-%d-%H.%i.%s'
    GET_FORMAT(TIMESTAMP,'JIS') '%Y-%m-%d %H:%i:%s'
    GET_FORMAT(TIMESTAMP,'ISO') '%Y-%m-%d %H:%i:%s'
    GET_FORMAT(TIMESTAMP,'EUR') '%Y-%m-%d-%H.%i.%s'
    GET_FORMAT(TIMESTAMP,'INTERNAL') '%Y%m%d%H%i%s'
    GET_FORMAT(TIME,'USA') '%h:%i:%s %p'
    GET_FORMAT(TIME,'JIS') '%H:%i:%s'
    GET_FORMAT(TIME,'ISO') '%H:%i:%s'
    GET_FORMAT(TIME,'EUR') '%H.%i.%S'
    GET_FORMAT(TIME,'INTERNAL') '%H%i%s'
    Le format ISO est le format ISO 9075, et non ISO 8601.
    
    mysql> SELECT DATE_FORMAT('2003-10-03', GET_FORMAT(DATE, 'EUR')
            -> '03.10.2003'
    mysql> SELECT STR_TO_DATE('10.31.2003', GET_FORMAT(DATE, 'USA'))
            -> 2003-10-31
    GET_FORMAT() est disponible depuis MySQL 4.1.1. Voyez Syntaxe de SET .

    HOUR(time)
    Retourne le nombre d'heures pour l'heure time , dans un intervalle de 0 à 23 :
    
    mysql> SELECT HOUR('10:05:03');
            -> 10
    Cependant, l'intervalle des valeurs TIME est bien plus grand, et donc, HOUR peut retourner des valeurs plus grandes que 23 :
    
    mysql> SELECT HOUR('272:59:59');
            -> 272
    LAST_DAY(date)
    Prend une valeur de format DATE ou DATETIME , et retourne le dernier jour du mois correspondant. Retourne NULL si l'argument est invalide.
    
    mysql> SELECT LAST_DAY('2003-02-05'), LAST_DAY('2004-02-05');
            -> '2003-02-28', '2004-02-29'
    mysql> SELECT LAST_DAY('2004-01-01 01:01:01');
            -> '2004-01-31'
    mysql> SELECT LAST_DAY('2003-03-32');
            -> NULL
    LAST_DAY() est disponible depuis MySQL 4.1.1.
    LOCALTIME
    LOCALTIME()
    LOCALTIME et LOCALTIME() sont synonymes de NOW() .
    LOCALTIMESTAMP
    LOCALTIMESTAMP()
    LOCALTIMESTAMP et LOCALTIMESTAMP() sont synonymes de NOW() .
    MAKEDATE(year,dayofyear)
    Retourne une valeur de format DATE , à partir d'une année et du numéro de jour. dayofyear doit être plus grand que 0 ou le résultat sera NULL .
    
    mysql> SELECT MAKEDATE(2001,31), MAKEDATE(2001,32);
            -> '2001-01-31', '2001-02-01'
    mysql> SELECT MAKEDATE(2001,365), MAKEDATE(2004,365);
            -> '2001-12-31', '2004-12-30'
    mysql> SELECT MAKEDATE(2001,0);
            -> NULL
    MAKEDATE() est disponible depuis MySQL 4.1.1.

    MAKETIME(hour,minute,second)
    Retourne une valeur de format TIME , calculée à partir des arguments hour , minute et second .
    
    mysql> SELECT MAKETIME(12,15,30);
            -> '12:15:30'
    MAKETIME() est disponible depuis MySQL 4.1.1.
    MICROSECOND(expr)
    Retourne le nombre de microsecondes dans l'expression de type TIME ou DATETIME expr , sous la forme d'un nombre entre 0 et 999999 .
    
    mysql> SELECT MICROSECOND('12:00:00.123456');
            -> 123456
    mysql> SELECT MICROSECOND('1997-12-31 23:59:59.000010');
            -> 10
    MICROSECOND() est disponible depuis MySQL 4.1.1.

    est disponible depuis

    MINUTE(time)
    Retourne le nombre de minutes pour l'heure time , dans un intervalle de 0 à 59 :
    
    mysql> SELECT MINUTE('98-02-03 10:05:03');
            -> 5
    MONTH(date)
    Retourne le numéro du mois de la date date , dans un intervalle de 1 à 12 :
    
    mysql> SELECT MONTH('1998-02-03');
            -> 2
    MONTHNAME(date)
    Retourne le nom du mois de la date date :
    
    mysql> SELECT MONTHNAME("1998-02-05");
            -> 'February'
    NOW()
    Retourne la date courante au format 'YYYY-MM-DD HH:MM:SS' ou YYYYMMDDHHMMSS , suivant le contexte numérique ou chaîne :
    
    mysql> SELECT NOW();
            -> '1997-12-15 23:50:26'
    mysql> SELECT NOW() + 0;
            -> 19971215235026
    PERIOD_ADD(P,N)
    Ajoute N mois à la période P (au format YYMM ou YYYYMM ). Retourne une valeur dans le format YYYYMM .

    Notez que l'argument P n'est pas de type date :

    
    mysql> SELECT PERIOD_ADD(9801,2);
            -> 199803
    PERIOD_DIFF(P1,P2)
    Retourne le nombre de mois entre les périodes P1 et P2 . P1 et P2 doivent être au format YYMM ou YYYYMM .Notez que les arguments P1 et P2 ne sont pas de type date :
    
    mysql> SELECT PERIOD_DIFF(9802,199703);
            -> 11
    QUARTER(date)
    Retourne le numéro du trimestre de la date date , dans un intervalle de 1 à 4 :
    
    mysql> SELECT QUARTER('98-04-01');
            -> 2
    SECOND(time)
    Retourne le nombre de secondes pour l'heure time , dans un intervalle de 0 à 59 :
    
    mysql> SELECT SECOND('10:05:03');
            -> 3
    SEC_TO_TIME(seconds)
    Retourne l'argument seconds , convertit en heures, minutes et secondes au format 'HH:MM:SS' ou HHMMSS , suivant le contexte numérique ou chaîne :
    
    mysql> SELECT SEC_TO_TIME(2378);
            -> '00:39:38'
    mysql> SELECT SEC_TO_TIME(2378) + 0;
            -> 3938
    STR_TO_DATE(str,format)
    Cette fonction est l'inverse de la fonction DATE_FORMAT() . Elle prend la chaîne str , et une chaîne de format format , puis retourne une valeur DATETIME . Les valeurs de type DATE , TIME ou DATETIME contenues dans la chaîne str doivent être au format format . Pour les options qui sont utilisables dans la chaîne format , voyez la table dans la description de la fonction DATE_FORMAT() . Tous les autres caractères sont utilisés littéralement, et ne seront pas interprétés. Si str contient une valeur illégale, STR_TO_DATE() retourne NULL .
    
    mysql> SELECT STR_TO_DATE('03.10.2003 09.20', '%d.%m.%Y %H.%i')
            -> 2003-10-03 09:20:00
    mysql> SELECT STR_TO_DATE('10rap', '%crap')
            -> 0000-10-00 00:00:00
    mysql> SELECT STR_TO_DATE('2003-15-10 00:00:00', '%Y-%m-%d %H:%i:%s')
            -> NULL
    STR_TO_DATE() est disponible depuis MySQL 4.1.1.

    SUBDATE(date,INTERVAL expr type)
    SUBDATE(expr,days)
    Lorsqu'elle est utilisée avec la forme INTERVAL du second argument, SUBDATE() est synonyme DATE_SUB() .
    
    mysql> SELECT DATE_SUB('1998-01-02', INTERVAL 31 DAY);
            -> '1997-12-02'
    mysql> SELECT SUBDATE('1998-01-02', INTERVAL 31 DAY);
            -> '1997-12-02'
    Depuis MySQL 4.1.1, la seconde syntaxe est autorisée, où expr est une expression de type DATE ou DATETIME et days est le nombre de jour à soustraire de l'expression expr .
    
    mysql> SELECT SUBDATE('1998-01-02 12:00:00', 31);
            -> '1997-12-02 12:00:00'
    SUBTIME(expr,expr2)
    SUBTIME() soustrait expr2 de expr et retourne le résultat. expr est une expression de format DATE ou DATETIME et expr2 est une expression de type TIME .
    
    mysql> SELECT SUBTIME("1997-12-31 23:59:59.999999", "1 1:1:1.000002");
            -> '1997-12-30 22:58:58.999997'
    mysql> SELECT SUBTIME("01:00:00.999999", "02:00:00.999998");
            -> '-00:59:59.999999'
    SUBTIME() a été ajoutée en MySQL 4.1.1.
    SYSDATE()
    SYSDATE() est un synonyme de NOW() .
    TIME(expr)
    Extrait la partie horaire de l'expression expr , de type TIME ou DATETIME .
    
    mysql> SELECT TIME('2003-12-31 01:02:03');
            -> '01:02:03'
    mysql> SELECT TIME('2003-12-31 01:02:03.000123');
            -> '01:02:03.000123'
    TIME() a été ajoutée en MySQL 4.1.1.

    TIMEDIFF(expr,expr2)

    TIMEDIFF() retourne la durée entre l'heure de début expr et l'heure de fin expr2 . expr et expr2 sont des expressions de type TIME ou DATETIME , et doivent être de même type.

    
    mysql> SELECT TIMEDIFF('2000:01:01 00:00:00', '2000:01:01 00:00:00.000001');
            -> '-00:00:00.000001'
    mysql> SELECT TIMEDIFF('1997-12-31 23:59:59.000001','1997-12-30 01:01:01.000002');
            -> '46:58:57.999999'
    TIMEDIFF() a été ajoutée en MySQL 4.1.1.

    TIMESTAMP(expr)
    TIMESTAMP(expr,expr2)
    Avec un seul argument, retourne l'expression expr de type DATE ou DATETIME sous la forme d'une valeur DATETIME . Avec deux arguments, ajouter l'expression expr2 à l'expression expr et retourne le résultat au format DATETIME .
    
    mysql> SELECT TIMESTAMP('2003-12-31');
            -> '2003-12-31 00:00:00'
    mysql> SELECT TIMESTAMP('2003-12-31 12:00:00','12:00:00');
            -> '2004-01-01 00:00:00'
    TIMESTAMP() a été ajoutée en MySQL 4.1.1.
    TIMESTAMPADD(interval,int_expr,datetime_expr)
    Ajoute l'expression entière int_expr à l'expression datetime_expr au format DATE ou DATETIME . L'unité de int_expr est donnée avec l'argument interval , qui peut être l'une des valeurs suivantes : FRAC_SECOND , SECOND , MINUTE , HOUR , DAY , WEEK , MONTH , QUARTER , ou YEAR .La valeur interval peut être spécifiée, en utilisant un des mots-clé cités, ou avec le préfixe SQL_TSI_ . Par exemple, DAY et SQL_TSI_DAY sont tous les deux valides.
    
    mysql> SELECT TIMESTAMPADD(MINUTE,1,'2003-01-02');
            -> '2003-01-02 00:01:00'
    mysql> SELECT TIMESTAMPADD(WEEK,1,'2003-01-02');
            -> '2003-01-09'
    TIMESTAMPADD() a été ajoutée en MySQL 5.0.0.
    TIMESTAMPDIFF(interval,datetime_expr1,datetime_expr2)
    Retourne la différence entière entre les expressions datetime_expr1 et datetime_expr2 , de format DATE et DATETIME . L'unité du résultat est donné par l'argument interval . Les valeurs légales de interval sont les mêmes que pour la fonction TIMESTAMPADD() .
    
    mysql> SELECT TIMESTAMPDIFF(MONTH,'2003-02-01','2003-05-01');
            -> 3
    mysql> SELECT TIMESTAMPDIFF(YEAR,'2002-05-01','2001-01-01');
            -> -1
    TIMESTAMPDIFF() a été ajoutée en MySQL 5.0.0.

    TIME_FORMAT(time,format)
    Cette fonction est utilisée exactement comme la fonction DATE_FORMAT() ci-dessus, mais la chaîne format ne doit utiliser que des spécificateurs d'heures, qui gèrent les heures, minutes et secondes. Les autres spécificateurs génèreront la valeur NULL ou 0 .

    Si la valeur time contient une valeur d'heure qui est plus grande que 23 , les formats %H et %k produiront une valeur qui est hors de l'intervalle 0..23 . L'autre format d'heure produira une heure modulo 12 :

    
    mysql> SELECT TIME_FORMAT('100:00:00', '%H %k %h %I %l');
            -> '100 100 04 04 4'
    TIME_TO_SEC(time)
    Retourne l'argument time , convertit en secondes :
    
    mysql> SELECT TIME_TO_SEC('22:23:00');
            -> 80580
    mysql> SELECT TIME_TO_SEC('00:39:38');
            -> 2378
    TO_DAYS(date)
    Retourne le nombre de jours depuis la date 0 jusqu'à la date date :
    
    mysql> SELECT TO_DAYS(950501);
            -> 728779
    mysql> SELECT TO_DAYS('1997-10-07');
            -> 729669
    TO_DAYS() n'est pas fait pour travailler avec des dates qui précèdent l'avènement du calendrier Grégorien (1582), car elle ne prend pas en compte les jours perdus lors du changement de calendrier.

    N'oubliez pas que MySQL convertit les années représentées sur deux chiffres en dates à quatre chiffres, en utilisant les règles de la section Types temporels . Par exemple, '1997-10-07' et '97-10-07' sont identiques :

    
    mysql> SELECT TO_DAYS('1997-10-07'), TO_DAYS('97-10-07');
            -> 729669, 729669
    Pour les dates antérieures à 1582, les résultats sont indéfinis.

    UNIX_TIMESTAMP()
    UNIX_TIMESTAMP(date)
    Lorsqu'elle est appelé sans argument, cette fonction retourne un timestamp Unix (nombre de secondes depuis '1970-01-01 00:00:00' GMT). Si UNIX_TIMESTAMP() est appelé avec un argument date , elle retourne le timestamp correspondant à cette date. date peut être une chaîne de type DATE , DATETIME , TIMESTAMP , ou un nombre au format YYMMDD ou YYYYMMDD , en horaire local :
    
    mysql> SELECT UNIX_TIMESTAMP();
            -> 882226357
    mysql> SELECT UNIX_TIMESTAMP('1997-10-04 22:23:00');
            -> 875996580
    Lorsque UNIX_TIMESTAMP est utilisé sur une colonne de type TIMESTAMP , la fonction reçoit directement la valeur, sans conversion explicite. Si vous donnez à UNIX_TIMESTAMP() une date hors de son intervalle de validité, elle retourne 0.Si vous voulez soustraire une colonne de type UNIX_TIMESTAMP() , vous devez sûrement vouloir un résultat de type entier signé. Fonctions de transtypage .

    UTC_DATE
    UTC_DATE()
    Retourne la date UTC courante au format 'YYYY-MM-DD' ou YYYYMMDD suivant le contexte numérique ou chaîne :
    
    mysql> SELECT UTC_DATE(), UTC_DATE() + 0;
            -> '2003-08-14', 20030814
    UTC_DATE() est disponible depuis MySQL 4.1.1.
    UTC_TIME
    UTC_TIME()
    Retourne l'heure UTC courante au format 'HH:MM:SS' or HHMMSS suivant le contexte numérique ou chaîne :
    
    mysql> SELECT UTC_TIME(), UTC_TIME() + 0;
            -> '18:07:53', 180753
    UTC_TIME() est disponible depuis MySQL 4.1.1.

    UTC_TIMESTAMP
    UTC_TIMESTAMP()
    Retourne l'heure et la date UTC courante au format 'YYYY-MM-DD HH:MM:SS' or YYYYMMDDHHMMSS suivant le contexte numérique ou chaîne :
    
    mysql> SELECT UTC_TIMESTAMP(), UTC_TIMESTAMP() + 0;
            -> '2003-08-14 18:08:04', 20030814180804
    UTC_TIMESTAMP() est disponible depuis MySQL 4.1.1.
    WEEK(date [,mode])
    Avec un seul argument, retourne le numéro de la semaine dans l'année de la date date , dans un intervalle de 0 à 53 (oui, il peut y avoir un début de semaine numéro 53), en considérant que Dimanche est le premier jour de la semaine. Avec deux arguments, la fonction WEEK() vous permet de spécifier si les semaines commencent le Dimanche ou le Lundi et la valeur retournée sera dans l'intervalle 0-53 ou bien 1-52 . Lorsque l'argument mode est omis, la valeur de la variable default_week_format (ou 0 en MySQL 4.0 ou plus ancien) est utilisé. Syntaxe de SET .Voici un tableau explicatif sur le fonctionnement du second argument :
    Valeur Signification
    0 La semaine commence le Sunday;l'intervalle de valeur de retour va de 0 à !2; la semaine 1 est la première semaine de l'année
    1 La semaine commence le Monday;l'intervalle de valeur de retour va de 0 à !2; la semaine 1 est la première semaine de l'année qui a plus de trois jours
    2 La semaine commence le Sunday;l'intervalle de valeur de retour va de 1 à !2; la semaine 1 est la première semaine de l'année
    3 La semaine commence le Monday;l'intervalle de valeur de retour va de 1 à !2; la semaine 1 est la première semaine de l'année qui a plus de trois jours
    4 La semaine commence le Sunday;l'intervalle de valeur de retour va de 0 à !2; la semaine 1 est la première semaine de l'année qui a plus de trois jours
    5 La semaine commence le Monday;l'intervalle de valeur de retour va de 0 à !2; la semaine 1 est la première semaine de l'année
    6 La semaine commence le Sunday;l'intervalle de valeur de retour va de 1 à !2; la semaine 1 est la première semaine de l'année qui a plus de trois jours
    7 La semaine commence le Monday;l'intervalle de valeur de retour va de 1 à !2; la semaine 1 est la première semaine de l'année
    Le mode 3 est disponible depuis MySQL 4.0.5. Le mode 4 est disponible depuis MySQL 4.0.17.
    
    mysql> SELECT WEEK('1998-02-20');
            -> 7
    mysql> SELECT WEEK('1998-02-20',0);
            -> 7
    mysql> SELECT WEEK('1998-02-20',1);
            -> 8
    mysql> SELECT WEEK('1998-12-31',1);
            -> 53
    Note : en version 4.0, WEEK(date,0) a été modifiée pour correspondre au système calendaire des USA. Avant cela, WEEK() était calculé incorrectement, pour des dates américaines : en effet, WEEK(date) et WEEK(date,0) étaient incorrects.Si vous préférez que le résultat soit calculé en fonction de l'année qui contient le premier jour de la semaine de la date utilisée en argument, vous devriez utiliser les valeurs 2, 3, 6, or 7 de l'argument mode .
    
    mysql> SELECT YEAR('2000-01-01'), WEEK('2000-01-01',0);
            -> 2000, 0
    mysql> SELECT WEEK('2000-01-01',2);
            -> 52
    Alternativement, utilisez la fonction YEARWEEK() :
    
    mysql> SELECT YEARWEEK('2000-01-01');
            -> 199952
    mysql> SELECT MID(YEARWEEK('2000-01-01'),5,2);
            -> '52'
    WEEKDAY(date)
    Retourne l'index du jour de la semaine, avec la conversion suivante : date ( 0 = Lundi, 1 = Mardi, ... 6 = Dimanche).
    
    mysql> SELECT WEEKDAY('1997-10-04 22:23:00');
            -> 5
    mysql> SELECT WEEKDAY('1997-11-05');
            -> 2
    WEEKOFYEAR(date)
    Retourne le numéro de semaine dans l'année, sous forme d'un nombre compris entre 1 et 53 .
    
    mysql> SELECT WEEKOFYEAR('1998-02-20');
            -> 8
    WEEKOFYEAR() est disponible depuis MySQL 4.1.1.

    YEAR(date)
    Retourne l'année de la date date , dans un intervalle de 1000 à 9999 :
    
    mysql> SELECT YEAR('98-02-03');
            -> 1998
    
    mysql> SELECT YEAR('98-02-03');
            -> 1998
    YEARWEEK(date)
    YEARWEEK(date,start)
    Retourne l'année et la semaine d'une date. L'argument start fonctionne exactement comme l'argument start de la fonction WEEK() . Notez que l'année dans le résultat peut être différente de l'année passée en argument, pour la première et la dernière semaine de l'année.
    
    mysql> SELECT YEARWEEK('1987-01-01');
            -> 198653
    Notez que le numéro de semaine est différent de celui que la fonction WEEK() retourne ( 0 ) pour les arguments optionnels 0 ou 1 , comme WEEK() puis retourne la semaine dans le contexte de l'année.

<< Fonctions de dates et d'heures >>
Fonctions numériques Fonctions à utiliser dans les clauses SELECT et WHERE Recherche en texte intégral ( Full-text ) dans MySQL