MySQL
Opérations de date et heure
Recherche…
À présent()
Select Now();
Affiche la date et l'heure actuelles du serveur.
Update `footable` set mydatefield = Now();
Cela mettra à jour le champ mydatefield
avec la date et l'heure du serveur en cours dans le fuseau horaire configuré du serveur, par exemple
'2016-07-21 12:00:00'
Arithmétique de date
NOW() + INTERVAL 1 DAY -- This time tomorrow
CURDATE() - INTERVAL 4 DAY -- Midnight 4 mornings ago
Affichez les questions mysql stockées qui ont été posées il y a 3 à 10 heures (il y a 180 à 600 minutes):
SELECT qId,askDate,minuteDiff
FROM
( SELECT qId,askDate,
TIMESTAMPDIFF(MINUTE,askDate,now()) as minuteDiff
FROM questions_mysql
) xDerived
WHERE minuteDiff BETWEEN 180 AND 600
ORDER BY qId DESC
LIMIT 50;
+----------+---------------------+------------+
| qId | askDate | minuteDiff |
+----------+---------------------+------------+
| 38546828 | 2016-07-23 22:06:50 | 182 |
| 38546733 | 2016-07-23 21:53:26 | 195 |
| 38546707 | 2016-07-23 21:48:46 | 200 |
| 38546687 | 2016-07-23 21:45:26 | 203 |
| ... | | |
+----------+---------------------+------------+
Pages de manuel MySQL pour TIMESTAMPDIFF()
.
Attention N'essayez pas d'utiliser des expressions comme CURDATE() + 1
pour l'arithmétique des dates dans MySQL. Ils ne renvoient pas ce que vous attendez, surtout si vous êtes habitué au produit de base de données Oracle. Utilisez CURDATE() + INTERVAL 1 DAY
place.
Test par rapport à une plage de dates
Bien que cela soit très tentant d'utiliser BETWEEN
... AND
... pour une plage de dates, cela pose problème. Au lieu de cela, ce modèle évite la plupart des problèmes:
WHERE x >= '2016-02-25'
AND x < '2016-02-25' + INTERVAL 5 DAY
Avantages:
-
BETWEEN
est inclusif, y compris la date finale ou la seconde. -
23:59:59
est maladroit et faux si vous avez une résolution en microseconde sur unDATETIME
. - Ce modèle évite de traiter des années bissextiles et d’autres calculs de données.
- Cela fonctionne si
x
estDATE
,DATETIME
ouTIMESTAMP
.
SYSDATE (), NOW (), CURDATE ()
SELECT SYSDATE();
Cette fonction renvoie la date et l'heure actuelles sous la forme 'YYYY-MM-DD HH:MM:SS'
ou au format YYYYMMDDHHMMSS
, selon que la fonction est utilisée dans un contexte de chaîne ou numérique. Il renvoie la date et l'heure dans le fuseau horaire actuel.
SELECT NOW();
Cette fonction est synonyme de SYSDATE()
.
SELECT CURDATE();
Cette fonction renvoie la date actuelle, sans aucune heure, sous forme de valeur au 'YYYY-MM-DD'
ou YYYYMMDD
, selon que la fonction est utilisée dans un contexte de chaîne ou numérique. Il renvoie la date dans le fuseau horaire actuel.
Extraire la date à partir de la date donnée ou de la date-heure
SELECT DATE('2003-12-31 01:02:03');
Le résultat sera:
2003-12-31
Utilisation d'un index pour une recherche par date et heure
De nombreuses tables de base de données réelles ont de nombreuses lignes avec des valeurs de colonne DATETIME
OU TIMESTAMP
couvrant beaucoup de temps, y compris des années, voire des décennies. Il est souvent nécessaire d'utiliser une clause WHERE
pour récupérer un sous-ensemble de cette période. Par exemple, nous pourrions vouloir récupérer des lignes pour la date du 1er septembre 2016 à partir d'une table.
Une façon inefficace de le faire est la suivante:
WHERE DATE(x) = '2016-09-01' /* slow! */
C'est inefficace car il applique une fonction - DATE()
- aux valeurs d'une colonne. Cela signifie que MySQL doit examiner chaque valeur de x
et qu'un index ne peut pas être utilisé.
Une meilleure façon de faire l'opération est la suivante:
WHERE x >= '2016-09-01'
AND x < '2016-09-01' + INTERVAL 1 DAY
Ceci sélectionne une plage de valeurs de x
située n'importe où le jour en question, jusqu'à mais n'incluant pas (donc <
) minuit le jour suivant.
Si la table possède un index sur la colonne x
, le serveur de base de données peut effectuer une analyse de plage sur l'index. Cela signifie qu'il peut rapidement trouver la première valeur pertinente de x, puis balayer l'index séquentiellement jusqu'à ce qu'il trouve la dernière valeur pertinente. Une analyse de plage d'index est beaucoup plus efficace que l'analyse de table complète requise par DATE(x) = '2016-09-01
.
Ne soyez pas tenté de l'utiliser, même si cela semble plus efficace.
WHERE x BETWEEN '2016-09-01' AND '2016-09-01' + INTERVAL 1 DAY /* wrong! */
Il a la même efficacité que l'analyse de distance, mais il sélectionnera les lignes avec des valeurs de x
tombant exactement à minuit le 2-sept-2016, ce qui n'est pas ce que vous voulez.