2012-03-08 17 views
44

C'è un modo per ottenere i millisecondi di un timestamp in MySql o PostgreSql (o altri solo per curiosità)?CURRENT_TIMESTAMP in millisecondi

SELECT CURRENT_TIMESTAMP 
--> 2012-03-08 20:12:06.032572 

C'è qualcosa di simile:

SELECT CURRENT_MILLISEC 
--> 1331255526000 

o l'unica alternativa è quella di utilizzare il DATEDIFF dal era?

+0

FROM_UNIXTIME (UNIX_TIMESTAMP (CONCAT (DATE (NOW()), '', CURTIME (3))), creerà un timestamp con millisecondi Regola il parametro in tempo reale per modificare il numero di decimali – user1119648

+0

@ user1119648 - Which DB? Nessun DB con 'CURTIME (3)' supporta anche 'NOW (3)'? Quindi 'CONCAT (DATE (NOW()), '', CURTIME (3))' potrebbe essere solo 'NOW (3)), almeno in MySQL 5.6.4+ Inoltre, 'FROM_UNIXTIME' e' UNIX_TIMESTAMP' sono inversi l'uno dall'altro, quindi 'FROM_UNIXTIME (UNIX_TIMESTAMP (qualunque))' risulta in 'qualunque'. La tua lunga espressione non è la stessa come 'NOW (3)'? – ToolmakerSteve

risposta

32

Per ottenere il timestamp Unix in secondi in MySQL:

select UNIX_TIMESTAMP(); 

Dettagli: http://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html#function_unix-timestamp

Non testato PostgreSQL, ma secondo questo sito dovrebbe funzionare: http://www.raditha.com/postgres/timestamp.php

select round(date_part('epoch', now())); 
+18

Non è questo preciso al secondo? –

+1

Questo è per il secondo. Ho letto male la domanda che penso. Non credo che MySQL restituisca millisecondi, ma dovrebbe essere in grado di gestirli se li fornite: http://stackoverflow.com/questions/2572209/why-doesnt-mysql-support-millisecond-microsecond-precision –

+0

Testato in postgreSQL, funziona ma restituisce un valore arrotondato in secondi invece di un valore preciso millisecondo come bigint. Vedere la mia risposta per la soluzione in postgreSQL: http://stackoverflow.com/a/28760763/3197383 –

4

In PostgreSQL è possibile utilizzare:

SELECT extract(epoch from now()); 

su MySQL:

SELECT unix_timestamp(now()); 
+2

Su MySQL che è accurato solo al secondo, non al millisecondo –

+0

In postgreSQL, la soluzione restituisce il timestamp unix in secondi frazionari.Vedi la mia risposta per ottenerlo in millisecondi come bigint: http://stackoverflow.com/a/28760763/3197383 –

7

Il modo corretto di estrarre millisecondi da un valore timestamp su PostgreSQL conseguenza per current documentation è:

SELECT date_part('milliseconds', current_timestamp); 

--OR 

SELECT EXTRACT(MILLISECONDS FROM current_timestamp); 

con rendimenti : Il campo dei secondi, incluse le parti frazionarie, moltiplicato per 1000. Si noti che questo include i secondi completi.

+0

Grazie Falco, mi dispiace non ero chiaro ma in realtà avevo bisogno del timestamp corrente in millisecondi .. Vedi l'esempio – Gevorg

+0

La tua soluzione restituisce il numero di millisecondi dall'inizio della giornata, non dal 1970/01/17. Vedi la mia risposta per la soluzione in postgreSQL: http://stackoverflow.com/a/28760763/3197383 –

6

Usa:

Select curtime(4); 

Questo vi darà millisecondi.

+4

Assicurati anche che la colonna DATETIME sia di lunghezza 6, dove è memorizzata. Inoltre hai bisogno di MySQL 5.6.x per lavorare con millisecondi. – TanuAD

+0

Gives '11: 08: 31.1845 'quindi non include la data – malhal

+0

@malhal è corretto, non fornisce il numero di millisecondi come le domande richieste. – MCToon

3

Ecco un'espressione che lavora per MariaDB e MySQL> = 5.6:

SELECT (UNIX_TIMESTAMP(NOW()) * 1000000 + MICROSECOND(NOW(6))) AS unix_now_in_microseconds; 

Questo si basa sul fatto che NOW() always returns the same time throughout a query; è possibile che anche un semplice UNIX_TIMESTAMP() funzioni, non sono sicuro che sia based on the documentation. Richiede anche MySQL> = 5.6 per il nuovo argomento di precisione per la funzione NOW() (anche MariaDB funziona).

28

In mysql, è possibile utilizzare la funzione uuid per estrarre i millisecondi.

select conv( 
      concat(
        substring(uid,16,3), 
        substring(uid,10,4), 
        substring(uid,1,8)) 
        ,16,10) 
      div 10000 
      - (141427 * 24 * 60 * 60 * 1000) as current_mills 
from (select uuid() uid) as alias; 

Risultato:

+---------------+ 
| current_mills | 
+---------------+ 
| 1410954031133 | 
+---------------+ 

Funziona anche in versioni di MySQL più grandi!

Grazie a questa pagina: http://rpbouman.blogspot.com.es/2014/06/mysql-extracting-timstamp-and-mac.html

+3

All'inizio ho riso, ma è l'unico modo che ho trovato finora per ottenere l'ora esatta in MySQL 5.5 ... quindi questa è la soluzione :) Ciao. –

+1

Wow - questo è fantastico! Spero non abbiano mai ** aggiustato ** questo comportamento. –

+0

se è necessario solo il microsecondi, allora si può usare: 'Seleziona SUBSTR ( CONV ( CONCAT ( SUBSTR (uid, 16,3), SUBSTR (uid, 10,4), SUBSTR (uid, 1,8)), 16, 10) DIV 10, -6) FROM (SELECT UUID() AS uid) AS alias; ' – lsblsb

3

modo più semplice che ho trovato a ricevere ora corrente in millisecondi in MySql:

SELECT (UNIX_TIMESTAMP(NOW(3)) * 1000) 

Dal MySql 5.6.

+1

Chi ha downvoted, cosa c'è di sbagliato in questa risposta? Funziona per quanto posso dire, basta essere consapevoli del fatto che restituisce un numero decimale che termina con '.000' invece di un intero. – Benjamin

33

Per MySQL (5.6+) si può fare questo:

SELECT ROUND(UNIX_TIMESTAMP(CURTIME(4)) * 1000) 

che restituirà (ad esempio):

1420998416685 --milliseconds 
4

Nessuna di queste risposte davvero risolvere il problema in PostgreSQL, vale a dire :

ottenere il unix timestamp di un campo data in millisecondi

Ho avuto lo stesso problema e testato le diverse risposte precedenti senza risultato soddisfacente.

Infine, ho trovato un modo molto semplice, probabilmente il più semplice:

SELECT (EXTRACT (EPOCH FROM <date_column>::timestamp)::float*1000 as unix_tms 
FROM <table> 

e cioè:

  • Estraiamo il pgSQL EPOCH, cioè unix timestamp in floatting secondi dalla nostra colonna casted in timestamp prudence (in alcune query complesse, pgSQL potrebbe generare un errore se questo cast non è esplicito.)
  • poi gettato in float e moltiplicarlo per 1000 per ottenere il valore in millisecondi
1

ho sentito il bisogno di continuare a perfezionare, così in MySQL:

timestamp corrente in millisecondi:

floor(unix_timestamp(current_timestamp(3)) * 1000) 

Timestamp in millisecondi da proposta datetime (3):

floor(unix_timestamp("2015-04-27 15:14:55.692") * 1000) 

Convert timestamp in millisecondi a datetime (3):

from_unixtime(1430146422456/1000) 

Convert datetime (3) timestamp in millisecondi:

floor(unix_timestamp("2015-04-27 14:53:42.456") * 1000) 
0

In MariaDB è possibile utilizzare

SELECT NOW(4); 

Per ottenere milisecs . Vedi anche here.

0

In PostgreSQL usiamo questo approccio:

SELECT round(EXTRACT (EPOCH FROM now())::float*1000) 
0

Ho affrontato lo stesso problema di recente e ho creato un piccolo progetto github che contiene una nuova funzione mysql UNIX_TIMESTAMP_MS() che restituisce il timestamp corrente in millisecondi.

Inoltre è possibile effettuare le seguenti operazioni:

SELECT UNIX_TIMESTAMP_MS(NOW(3)) o SELECT UNIX_TIMESTAMP_MS(DateTimeField)

Il progetto si trova qui: https://github.com/silviucpp/unix_timestamp_ms

Per compilare è necessario eseguire Proprio make compile nella radice del progetto.

allora avete bisogno di copiare solo la libreria condivisa nella /usr/lib/mysql/plugin/ (o qualunque sia la cartella plugin è sulla vostra macchina.)

Dopo questo basta aprire una console di mysql ed eseguire:

CREATE FUNCTION UNIX_TIMESTAMP_MS RETURNS INT SONAME 'unix_timestamp_ms.so';

Spero che questo vi aiuterà, Silviu

+0

Dopo un giro di refactoring riesco ad avere prestazioni migliori rispetto alla funzione UNIX_TIMESTAMP integrata. – silviu

+0

Dato che si sta collegando al codice che hai ** protetto da copyright **, si prega di chiarire i termini della licenza. Idealmente, aggiungendo un file di licenza al repository github. Vedi https://github.com/blog/1530-choosing-an-open-source-license – ToolmakerSteve

+0

@ToolmakerSteve grazie! Ho aggiunto la licenza – silviu

4

in MySQL 5.7+ è possibile eseguire

select current_timestamp(6) 

per maggiori dettagli

https://dev.mysql.com/doc/refman/5.7/en/fractional-seconds.html

+1

Nota: questo era disponibile anche in Mysql 5.6.4: https://dev.mysql.com/doc/refman/5.6/en/fractional-seconds.html Inoltre, 'current_timestamp' è un sinonimo di' now', quindi 'now (6)' è un modo più breve per ottenere quel valore. – ToolmakerSteve

2

L'equivoco principale di MySQL con timestamp è che MySQL di default sia i rendimenti e negozi di timestamp senza una parte frazionaria.

SELECT current_timestamp() => 2018-01-18 12:05:34 

che può essere convertito in secondi timestamp come

SELECT UNIX_TIMESTAMP(current_timestamp()) => 1516272429 

Per aggiungere parte frazionaria:

SELECT current_timestamp(3) => 2018-01-18 12:05:58.983 

che può essere convertito in microsecondi timestamp come

SELECT CAST(1000*UNIX_TIMESTAMP(current_timestamp(3)) AS UNSIGNED INTEGER) ts => 1516272274786 

Ci sono pochi trucchi w con memorizzazione in tabelle. Se la tabella è stato creato come

CREATE TABLE `ts_test_table` (
     `id` int(1) NOT NULL, 
     `not_fractional_timestamp` timestamp NULL DEFAULT CURRENT_TIMESTAMP, 
     PRIMARY KEY (`id`) 
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; 

di MySQL non memorizzerà parte frazionaria al suo interno:

id, not_fractional_timestamp 
    1, 2018-01-18 11:35:12 

Se si desidera aggiungere parte frazionaria nella vostra tabella, è necessario creare il vostro tavolo in un altro modo :

CREATE TABLE `ts_test_table2` (
     `id` int(1) NOT NULL, 
     `some_data` varchar(10) COLLATE utf8mb4_unicode_ci NOT NULL, 
     `fractional_timestamp` timestamp(3) NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3), 
     PRIMARY KEY (`id`) 
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; 

che porta al risultato requiered:

id, some_data, fractional_timestamp 
    1, 8,   2018-01-18 11:45:40.811 

La funzione current_timestamp() è in grado di ricevere valore fino a 6, ma ho scoperto (almeno nella mia versione installata di MySQL 5.7.11) che la precisione di frazione 6 porta allo stesso valore costante di 3 cifre alla coda , nel mio caso 688

id, some_data, fractional_timestamp 
    1, 2,   2018-01-18 12:01:54.167688 
    2, 4,   2018-01-18 12:01:58.893688 

Ciò significa che la precisione reale utilizzabile in MySQL è 3.