2014-10-10 15 views
37

Devo sviluppare un'applicazione utilizzando 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 non ha funzionato. Tutti i valori sono impostati per 0000-00-00 00:00:00Timestamp con precisione millisecondo: come salvarli in MySQL

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 in modo da essere in grado di salvare valori timestamp con questa precisione?

+0

Quale versione di MySQL? – Strawberry

+0

mysql Ver 14.14 Distrib 5.6.11, per Win32 (x86) – Luixv

+0

Sembra che tu sia fortunato. – Strawberry

risposta

62

È necessario essere in MySQL versione 5.6.4 o successiva per dichiarare colonne con tipi di dati temporali frazionari. 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) vi darà il tempo presente dal sistema operativo del server MySQL con precisione millisecondo.

Se si dispone di un numero di millisecondi dal momento che il Unix epoch, provate questo per ottenere un DATETIME (3) Valore

FROM_UNIXTIME(ms * 0.001) 

Javascript timestamps, per esempio, sono rappresentate in millisecondi a partire dalla Unix epoch.

(Si noti che MySQL aritmetica frazionale interno, come * 0.001, è sempre gestito come virgola mobile IEEE754 doppia precisione, quindi è improbabile che si perde di precisione prima che il Sole diventa una stella nana bianca.)

Se si' usando una versione precedente di MySQL e hai bisogno di precisione in secondi, il tuo miglior percorso è quello di aggiornare. Qualsiasi altra cosa ti costringerà a fare soluzioni disordinate.

Se, per qualche motivo, non è possibile eseguire l'aggiornamento, è possibile considerare l'utilizzo delle colonne BIGINT o DOUBLE per memorizzare timestamp JavaScript come se fossero numeri. FROM_UNIXTIME(col * 0.001) funzionerà ancora OK. Se ti serve l'ora corrente per archiviare in tale colonna, puoi utilizzare UNIX_TIMESTAMP() * 1000

+0

Ho cambiato la mia definizione in timestamp (6) ma quando provo ad aggiungere valori usando questa sintassi INSERT INTO VALUTA (misurato_at, probabilità, provider_id, segment_id) VALUES (1412877161519,0.7418073347680607,1,211623); Ancora ottengo 0000-00-00 00: 00: 00.00000 nella colonna "measured_at". Come dovrei inserire valori in questa tabella? – Luixv

+1

@Luixv avresti bisogno di convertire il valore nel modo in: 'INSERIRE ... VALORI (FROM_UNIXTIME (0.001 * 1412877161519), 0.7418 ...);' –

+0

Moltiplicare per 0.001 è un vero toccasana! Non avrei mai potuto immaginare che avrebbe funzionato senza perdere una seconda frazione. Grazie. –