web-dev-qa-db-fra.com

Horodatage avec une précision milliseconde: comment les enregistrer dans MySQL

Je dois développer une application utilisant MySQL et enregistrer des valeurs telles que "1412792828893", qui représentent un horodatage mais avec une précision d'une milliseconde. C'est-à-dire la quantité de millisecondes depuis le 1.1.1970. Je déclare la ligne timestamp mais malheureusement, cela n'a pas fonctionné. Toutes les valeurs sont définies sur 0000-00-00 00:00:00

CREATE TABLE IF NOT EXISTS `probability` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`segment_id` int(11) NOT NULL,
`probability` float NOT NULL,
`measured_at` timestamp NOT NULL,
`provider_id` int(11) NOT NULL,
PRIMARY KEY (`id`)
) ;

Comment doit être la déclaration pour pouvoir sauvegarder les valeurs d'horodatage avec cette précision?

65
Luixv

Vous devez être à la version 5.6.4 ou ultérieure de MySQL pour déclarer des colonnes avec des types de données temporels d’une fraction de seconde. Vous n'êtes pas sûr d'avoir la bonne version? Essayez SELECT NOW(3). Si vous obtenez une erreur, vous n'avez pas la bonne version.

Par exemple, DATETIME(3) vous donnera une résolution en millisecondes dans vos horodatages, et TIMESTAMP(6) vous donnera une résolution en microsecondes sur un horodatage de style * nix.

Lisez ceci: https://dev.mysql.com/doc/refman/8.0/en/fractional-seconds.html

NOW(3) vous donnera l'heure actuelle à partir du système d'exploitation de votre serveur MySQL avec une précision milliseconde.

Si vous avez plusieurs millisecondes depuis le nix Epoch , essayez ceci pour obtenir une valeur DATETIME (3)

FROM_UNIXTIME(ms * 0.001)

horodatage Javascript , par exemple, est représenté en millisecondes depuis le Epoque Unix .

(Notez que l'arithmétique fractionnelle interne de MySQL, comme * 0.001, est toujours traitée comme une virgule flottante double précision IEEE754. Il est donc peu probable que vous perdiez de la précision avant que le Soleil ne devienne une étoile naine blanche.)

Si vous utilisez une ancienne version de MySQL et que vous avez besoin d'une précision temporelle inférieure à une seconde, votre meilleur chemin consiste à mettre à niveau. Tout le reste vous forcera à faire des solutions de rechange désordonnées.

Si, pour une raison quelconque, vous ne pouvez pas effectuer de mise à niveau, vous pouvez envisager d'utiliser les colonnes BIGINT ou DOUBLE pour stocker les horodatages Javascript comme s'il s'agissait de nombres. FROM_UNIXTIME(col * 0.001) fonctionnera toujours correctement. Si vous avez besoin de l'heure actuelle pour stocker dans une telle colonne, vous pouvez utiliser UNIX_TIMESTAMP() * 1000

103
O. Jones