7.3.11 Fonctions de date et heure

7.2.6 Types date et heure pour une description précise des intervalles de validité de chaque type.

Voici un exemple qui utilise des fonctions sur les dates et heures. La requête ci-dessous sélectionne toutes les lignes avec une valeur qui est date_col dans les 30 derniers jours :

mysql> SELECT quelquechose FROM table
           WHERE TO_DAYS(NOW()) - TO_DAYS(date_col) <= 30;
  • DAYOFWEEK(date) Retourne le jour de la semaine sous la forme d'un index qui commence à 1 (1 = Dimanche, 2 = Lundi, ... 7 = Samedi). Ces valeurs sont celles du standard ODBC.
    mysql> select DAYOFWEEK('1998-02-03');
            -> 3
    
  • WEEKDAY(date) Retourne le jour de la semaine sous la forme d'un index qui commence à 0 (0 = Dimanche, 1 = Lundi, ... 6 = Samedi).
    mysql> select WEEKDAY('1997-10-04 22:23:00');
            -> 5
    mysql> select WEEKDAY('1997-11-05');
            -> 2
    
  • DAYOFMONTH(date) Retourne le jour du mois sous la forme d'un index entre 1 et 31.
    mysql> select DAYOFMONTH('1998-02-03');
            -> 3
    
  • DAYOFYEAR(date) Retourne le jour de l'année sous la forme d'un index entre 1 et 366.
    mysql> select DAYOFYEAR('1998-02-03');
            -> 34
    
  • MONTH(date) Retourne le mois de la date sous la forme d'un index entre 1 et 12.
    mysql> select MONTH('1998-02-03');
            -> 2
    
  • DAYNAME(date) Retourne le nom du jour de la date sous la forme d'une chaîne (en anglais ).
    mysql> select DAYNAME("1998-02-05");
            -> 'Thursday'
    
  • MONTHNAME(date) Retourne le nom du mois de la date sous la forme d'une chaîne (en anglais ).
    mysql> select MONTHNAME("1998-02-05");
            -> 'February'
    
  • QUARTER(date) Retourne le trimestre de la date sous la forme d'un index entre 1 et 4.
    mysql> select QUARTER('98-04-01');
            -> 2
    
  • WEEK(date)
  • WEEK(date,first) Avec un seul argument, retourne la semaine de la date sous la forme d'un index entre 1 à 52, avec Dimanche comme premier jour de la semaine. La fonction avec deux arguments permet de préciser si la semaine commence à Dimanche (0) ou Lundi (1).
    mysql> select WEEK('1998-02-20');
            -> 7
    mysql> select WEEK('1998-02-20',0);
            -> 7
    mysql> select WEEK('1998-02-20',1);
            -> 8
    
  • YEAR(date) Retourne l'année de la date sous la forme d'un index entre 1000 et 9999.
    mysql> select YEAR('98-02-03');
            -> 1998
    
  • HOUR(time) Retourne l'heure de la date sous la forme d'un index entre 0 et 23.
    mysql> select HOUR('10:05:03');
            -> 10
    
  • MINUTE(time) Retourne la minute de la date sous la forme d'un index entre 0 et 59.
    mysql> select MINUTE('98-02-03 10:05:03');
            -> 5
    
  • SECOND(time) Retourne la seconde de la date sous la forme d'un index entre 0 et 59.
    mysql> select SECOND('10:05:03');
            -> 3
    
  • PERIOD_ADD(P,N) Ajoute N mois à la date P (au format YYMM ou YYYYMM). Retourne le résultat au format YYYYMM. Il faut bien noter que la date P n'est pas au format date.
    mysql> select PERIOD_ADD(9801,2);
            -> 199803
    
  • PERIOD_DIFF(P1,P2) Retourne le nombre de mois entre deux dates P1 et P2. P1 et P2 doivent être au format . Il faut bien noter que les dates P1 et P2 ne sont pas au format date.
    mysql> select PERIOD_DIFF(9802,199703);
            -> 11
    

  • DATE_ADD(date,INTERVAL expression type)
  • DATE_SUB(date,INTERVAL expression type)
  • ADDDATE(date,INTERVAL expression type)
  • SUBDATE(date,INTERVAL expression type) Ces fonctions effectuent des opérations arithmétiques sur les dates. Elles ont été inserées dans MySQL 3.22. ADDDATE() et SUBDATE() sont synonymes de DATE_ADD() et DATE_SUB(). date est de type DATETIME ou DATE , qui indique la date de début. expression est une expression qui donne une durée à ajouter ou à retrancher à la date de début. expression est une chaîne qui peut commencer par un signe moins (``-''), pour indiquer une durée négative. type est un mot clé qui indique comment l'expression doit être considéré. La table suivante établit la relation type et expression :
    type value Meaning Expected expr format
    SECOND Seconds SECONDS
    MINUTE Minutes MINUTES
    HOUR Hours HOURS
    DAY Days DAYS
    MONTH Months MONTHS
    YEAR Years YEARS
    MINUTE_SECOND Minutes and seconds "MINUTES:SECONDS"
    HOUR_MINUTE Hours and minutes "HOURS:MINUTES"
    DAY_HOUR Days and hours "DAYS HOURS"
    YEAR_MONTH Years and months "YEARS-MONTHS"
    HOUR_SECOND Hours, minutes, "HOURS:MINUTES:SECONDS"
    DAY_MINUTE Days, hours, minutes "DAYS HOURS:MINUTES"
    DAY_SECOND Days, hours, minutes, seconds "DAYS HOURS:MINUTES:SECONDS"
    MySQL allows any non-numeric delimiter in the expr format. The ones shown in the table are the suggested delimiters. If the date argument is a DATE value and your calculations involve only YEAR, MONTH and DAY parts (that is, no time parts), the result is a DATE value. Otherwise the result is a DATETIME value.
    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 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 accepte l'utilisation de délimiteurs non-numériques dans le format de expression . Ceux présentés dans le tableaux ne sont que des suggestions. Si l'argument date est au format DATE et que les calculs font intervenir seulement YEAR, MONTH et DAY (c'est à dire, juste la date, par l'heure.), le résultat est de type DATE . Sinon, le résultat des de type DATETIME .
    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
    

    Si l'argument de durée est trop court par rapport au mot clé spécifié, MySQL suppose que les parties de gauche sont mises à zéro. Par exemple, avec le mot clé DAY_SECOND , s'attend à trouver le format "JOURS HEURES:MINUTES:SECONDES" . Si l'argument de durée est "1:10", supposera que les jours et heures sont à 0, et que seules, les minutes et secondes sont fournies. En un sens, MySQL ignore le type spécifié, et utilise à la place MINUTE_SECOND. Si les dates sont incorrectes, le résultat est NULL. Par ailleurs, lors de l'utilisation des options MONTH, YEAR_MONTH ou YEAR, et que dans le mois résultant, la date du jours n'existe pas, elle est automatiquement ramenée à la plus grande valeur qu'elle peut prendre dans ce mois.

    mysql> select DATE_ADD('1998-01-30', Interval 1 month);
            -> 1998-02-28
    

    Note from the preceding example that the word INTERVAL and the type keyword are not case sensitive.

  • TO_DAYS(date) Retourne l'index du jour par rapport au 1er janvier 0.
    mysql> select TO_DAYS(950501);
            -> 728779
    mysql> select TO_DAYS('1997-10-07');
            -> 729669
    

    TO_DAYS() n'est pas prévu pour utiliser des dates précédents l'avènement du calendrier Grégorien. (1582)..

  • FROM_DAYS(N) Etant donné un numéro de jour par rapport au 1er janvier 0, retourne une valeur de type DATE.
    mysql> select FROM_DAYS(729669);
            -> '1997-10-07'
    

    FROM_DAYS()n'est pas prévu pour utiliser des dates précédents l'avènement du calendrier Grégorien. (1582).

  • DATE_FORMAT(date,format) Formate la date date en fonction de la chaîne format. Les formats suivants peuvent être utilisé dans format :
    %M Month name (January..December)
    %W Weekday name (Sunday..Saturday)
    %D Day of the month with english suffix (1st, 2nd, 3rd, etc.)
    %Y Year, numeric, 4 digits
    %y Year, numeric, 2 digits
    %a Abbreviated weekday name (Sun..Sat)
    %d Day of the month, numeric (00..31)
    %e Day of the month, numeric (0..31)
    %m Month, numeric (01..12)
    %c Month, numeric (1..12)
    %b Abbreviated month name (Jan..Dec)
    %j Day of year (001..366)
    %H Hour (00..23)
    %k Hour (0..23)
    %h Hour (01..12)
    %I Hour (01..12)
    %l Hour (1..12)
    %i Minutes, numeric (00..59)
    %r Time, 12-hour (hh:mm:ss [AP]M)
    %T Time, 24-hour (hh:mm:ss)
    %S Seconds (00..59)
    %s Seconds (00..59)
    %p AM or PM
    %w Day of the week (0=Sunday..6=Saturday)
    %U Week (0..52), where Sunday is the first day of the week
    %u Week (0..52), where Monday is the first day of the week
    %% A literal `%'.
    Tous les autres caractères sont recopiés, sans interpretation
    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'
    

    Depuis MySQL 3.23, le caractère % est obligatoire devant le caractère de format. Dans les versions antérieures de MySQL, % il était optionnel.

  • TIME_FORMAT(time,format) Utilisation identique à DATE_FORMAT(), mais seulement pour les heures (heures, minutes secondes). Les autres arguments conduisent à un résultat a NULL ou 0.
  • CURDATE()
  • CURRENT_DATE Retourne la date du jour, au format 'YYYY-MM-DD' ou YYYYMMDD , suivant que la fonction est utilisée en contexte chaîne ou numérique
    mysql> select CURDATE();
            -> '1997-12-15'
    mysql> select CURDATE() + 0;
            -> 19971215
    
  • CURTIME()
  • CURRENT_TIME Retourne l'heure du jour, au format 'HH:MM:SS' or HHMMSS, suivant que la fonction est utilisée en contexte chaîne ou numérique
    mysql> select CURTIME();
            -> '23:50:26'
    mysql> select CURTIME() + 0;
            -> 235026
    
  • NOW()
  • SYSDATE()
  • CURRENT_TIMESTAMP Retourne la date et l'heure du jour, au format 'YYYY-MM-DD HH:MM:SS' or YYYYMMDDHHMMSS, suivant que la fonction est utilisée en contexte chaîne ou numérique
    mysql> select NOW();
            -> '1997-12-15 23:50:26'
    mysql> select NOW() + 0;
            -> 19971215235026
    
  • UNIX_TIMESTAMP()
  • UNIX_TIMESTAMP(date) Utilisé sans argument, retourne un timestamp Unix (le nombre de secondes depuis '1970-01-01 00:00:00' GMT) . Utilisé avec un argument de type date, il renvoie le timestamp Unix correspondant à cette date. DATE peut être aux formats chaîne DATE chaîne, DATETIME chaîne, TIMESTAMP, ou un nombre au format YYMMDD ou YYYYMMDD.
    mysql> select UNIX_TIMESTAMP();
            -> 882226357
    mysql> select UNIX_TIMESTAMP('1997-10-04 22:23:00');
            -> 875996580
    

    Quand un UNIX_TIMESTAMP est affecté à une colonne de type TIMESTAMP, l'affectation sera directe, avec aucune conversion implicite.

  • FROM_UNIXTIME(unix_timestamp) Retourne la représentation de l'argument unix_timestamp au format 'YYYY-MM-DD HH:MM:SS' or YYYYMMDDHHMMSS suivant que la fonction est utilisée en contexte chaîne ou numérique
    mysql> select FROM_UNIXTIME(875996580);
            -> '1997-10-04 22:23:00'
    mysql> select FROM_UNIXTIME(875996580) + 0;
            -> 19971004222300
    
  • FROM_UNIXTIME(unix_timestamp,format) Retourne la représentation de l'argument unix_timestamp au format format, suivant que la fonction est utilisée en contexte chaîne ou numérique. Le format est spécifié comme pour la fonction the DATE_FORMAT().
    mysql> select FROM_UNIXTIME(UNIX_TIMESTAMP(),
                                '%Y %D %M %h:%i:%s %x');
            -> '1997 23rd December 03:43:30 x'
    
  • SEC_TO_TIME(seconds) Converti l'argument seconds en heures, minutes et secondes, au format 'HH:MM:SS' or HHMMSS, suivant que la fonction est utilisée en contexte chaîne ou numérique
    mysql> select SEC_TO_TIME(2378);
            -> '00:39:38'
    mysql> select SEC_TO_TIME(2378) + 0;
            -> 3938
    
  • TIME_TO_SEC(time) Retourne l'argument time, converti en secondes.
    mysql> select TIME_TO_SEC('22:23:00');
            -> 80580
    mysql> select TIME_TO_SEC('00:39:38');
            -> 2378