Timestamp con precisione millisecondo: come salvarli in MySQL

Devo sviluppare un’applicazione usando MySQL e devo salvare valori come “1412792828893” che rappresentano un timestamp ma con una precisione di un millisecondo. Cioè, la quantità di millisecondi dal 1.1.1970. Dichiaro la riga come timestamp ma sfortunatamente questo non ha funzionato. Tutti i valori sono impostati su 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`) ) ; 

Come dovrebbe essere la dichiarazione per poter salvare i valori di timestamp con questa precisione?

È necessario essere in MySQL versione 5.6.4 o successive per dichiarare le colonne con i tipi di dati del tempo frazionario. Non sei sicuro di avere la versione giusta? Prova SELECT NOW(3) . Se ricevi un errore, non hai la versione giusta.

Ad esempio, DATETIME(3) ti darà una risoluzione in millisecondi nei tuoi timestamp e TIMESTAMP(6) ti darà una risoluzione in microsecondi su un timestamp in stile * nix.

Leggi questo: http://dev.mysql.com/doc/refman/5.7/en/fractional-seconds.html

NOW(3) ti darà il tempo presente dal sistema operativo del tuo server MySQL con precisione millisecondo.

Se hai un numero di millisecondi dall’epoca di Unix , prova questo per ottenere un valore DATETIME (3)

 FROM_UNIXTIME(ms * 0.001) 

I timestamp di Javascript , ad esempio, sono rappresentati in millisecondi dall’epoca Unix .

(Si noti che l’aritmetica interna frazionaria di MySQL, come * 0.001 , viene sempre gestita come IEEE754 in virgola mobile a doppia precisione, quindi è improbabile che si perda precisione prima che il Sole diventi una stella nana bianca.)

Se stai utilizzando una versione precedente di MySQL e hai bisogno di precisione in secondi, il tuo miglior percorso è l’aggiornamento. Qualsiasi altra cosa ti costringerà a fare soluzioni disordinate.

Se, per qualche motivo, non è ansible eseguire l’aggiornamento, è ansible utilizzare le colonne BIGINT o DOUBLE per memorizzare timestamp JavaScript come se fossero numeri. FROM_UNIXTIME(col * 0.001) funzionerà ancora FROM_UNIXTIME(col * 0.001) . Se ti serve l’ora corrente da memorizzare in una colonna di questo tipo, puoi utilizzare UNIX_TIMESTAMP() * 1000