• Aucun résultat trouvé

Fonctions de date et heure

Parentheses. Use these to force the order of evaluation in an expression

7.3.11 Fonctions de date et heure

Confère section 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');

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_SECON

D 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