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 un DATETIME .
  • Ce modèle évite de traiter des années bissextiles et d’autres calculs de données.
  • Cela fonctionne si x est DATE , DATETIME ou TIMESTAMP .

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.



Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow