Mysql
 sql >> Base de données >  >> RDS >> Mysql

MySQL sélectionne DATETIME similaire jusqu'à la minute

Cette expression MySql vous rendra les valeurs DATETIME avec les secondes mises à zéro.

CONVERT(DATE_FORMAT(table.column,'%Y-%m-%d-%H:%i:00'),DATETIME)

Regarde ça. https://dev .mysql.com/doc/refman/8.0/en/date-and-time-functions.html#function_date-format . Vous pourriez donc vous retrouver avec une requête comme celle-ci :

SELECT Table1.TimeSTamp1, Table1.Param1, Table2.TimeStamp2, Table2.Param2 
    FROM Table1
    JOIN Table2 ON  CONVERT(DATE_FORMAT(Table1.TimeStamp1,'%Y-%m-%d-%H:%i:00'),DATETIME)
                 =  CONVERT(DATE_FORMAT(Table2.TimeStamp2,'%Y-%m-%d-%H:%i:00'),DATETIME)
    WHERE ... conditions for the other parameters of Table1 and Table2... 

Mais fais attention. Les horodatages générés automatiquement sont un peu comme des nombres à virgule flottante ; quand deux d'entre eux se retrouvent égaux l'un à l'autre, c'est juste de la chance. Tronquer vos horodatages à la minute peut être acceptable, mais il peut également être préférable de soustraire un horodatage d'un autre et de comparer les différences (ou les valeurs absolues des différences).

De plus, cette jointure va être lente car elle doit exécuter la seconde fonction de troncature sur chaque valeur, elle ne peut donc pas utiliser d'index.

Vous pouvez soustraire un horodatage d'un autre avec TIMESTAMPDIFF() . Mais fais attention. Cette fonction ne fonctionne correctement qu'au niveau des secondes pour les horodatages à quelques jours d'intervalle; il déborde sans grâce (comme je l'ai découvert avec beaucoup de douleur).

Vous pouvez essayer de tronquer les horodatages en minutes au moment où vous les insérez. Cela vous permettrait de les indexer.