web-dev-qa-db-fra.com

CURRENT_TIMESTAMP en millisecondes

Existe-t-il un moyen d’obtenir des millisecondes d’un horodatage dans MySql ou PostgreSql (ou d’autres par simple curiosité)?

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

Y a-t-il quelque chose comme ça:

SELECT CURRENT_MILLISEC
--> 1331255526000

ou la seule alternative est d'utiliser la DATEDIFF à partir de la era?

51
Gevorg

Pour obtenir le timestamp Unix en secondes dans MySQL:

select UNIX_TIMESTAMP();

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

Non testé PostgreSQL, mais selon ce site cela devrait fonctionner: http://www.raditha.com/postgres/timestamp.php

select round( date_part( 'Epoch', now() ) );
38
Billy Moon

Pour MySQL (5.6+), vous pouvez faire ceci:

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

Ce qui retournera (par exemple):

1420998416685 --milliseconds
45
Claudio Holanda

Dans mysql, il est possible d'utiliser la fonction uuid pour extraire des millisecondes.

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;

Résultat:

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

Cela fonctionne aussi dans les anciennes versions de mysql!

Merci à cette page: http://rpbouman.blogspot.com.es/2014/06/mysql-extracting-timstamp-and-mac.html

31
jbaylina

Dans Mysql 5.7+, vous pouvez exécuter 

select current_timestamp(6)

pour plus de détails

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

8
Ahmed

La manière correcte d’extraire des millisecondes d’une valeur d’horodatage sur PostgreSQL conformément à documentation actuelle est la suivante:

SELECT date_part('milliseconds', current_timestamp);

--OR

SELECT EXTRACT(MILLISECONDS FROM current_timestamp);

with return: Le champ des secondes, y compris les fractions, multiplié par 1000. Notez que cela inclut les secondes.

7
Falco

Utilisation:

Select curtime(4);

Cela vous donnera des millisecondes.

6
TanuAD

Dans PostgreSQL, vous pouvez utiliser: 

SELECT extract(Epoch from now());

sur MySQL:

SELECT unix_timestamp(now());
4
aleroot

Voici une expression qui fonctionne pour MariaDB et MySQL> = 5.6:

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

Cela repose sur le fait que NOW () renvoie toujours le même temps dans une requête ; il est possible qu'un UNIX_TIMESTAMP() fonctionne également, je ne suis pas sûr d'après la documentation . MySQL> = 5.6 est également requis pour le nouvel argument de précision de la fonction NOW() (MariaDB fonctionne également).

4
Walter Mundt

Aucune de ces réponses ne résout vraiment le problème dans postgreSQL , c'est-à-dire:

obtenir le timestamp unix d'un champ de date en millisecondes

J'ai eu le même problème et testé les différentes réponses précédentes sans résultat satisfaisant.

Enfin, j'ai trouvé un moyen très simple, probablement le plus simple:

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

à savoir:

  • Nous extrayons le pgSQL Epoch, c'est-à-dire unix timestamp en floatting seconds de notre colonne exprimée avec prudence timestamp (dans certaines requêtes complexes, pgSQL pourrait générer une erreur si cette distribution n'est pas explicite. Voir)
  • puis on le lance en float et on le multiplie par 1000 pour obtenir la valeur en millisecondes
4
Rémi Becheras

Le principal malentendu dans MySQL avec les horodatages est que MySQL par défaut renvoie et stocke les horodatages sans partie décimale .

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

qui peut être converti en timestamp secondes en tant que

SELECT UNIX_TIMESTAMP(current_timestamp()) => 1516272429

Pour ajouter une partie fractionnaire:

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

qui peut être converti en horodatage en microsecondes

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

Il y a quelques astuces pour stocker dans des tables. Si votre table a été créée comme

    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;

que MySQL NE stockera PAS une partie décimale dedans:

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

Si vous souhaitez ajouter une partie fractionnaire à votre table, vous devez créer votre table d'une autre manière:

    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;

qui conduit au résultat requis:

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

la fonction current_timestamp () est autorisée à recevoir une valeur allant jusqu'à 6, mais j'ai découvert (au moins dans ma version installée de MySQL 5.7.11 sous Windows) que la précision de fraction 6 conduit à la même valeur constante de 3 chiffres à la fin dans mon cas 688

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

Cela signifie que la précision temporelle de MySQL réellement utilisable dépend de la plate-forme:

  • sous Windows: 3
  • sous Linux: 6
4
Igor

Le moyen le plus simple que j'ai trouvé de recevoir l'heure actuelle en millisecondes dans MySql:

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

Depuis MySql 5.6.

3
Yuval

J'ai ressenti le besoin de continuer à peaufiner, donc dans MySQL:

Horodatage actuel en millisecondes:

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

Horodatage en millisecondes à partir de la date/heure donnée (3):

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

Convertissez l'horodatage en millisecondes en date/heure (3):

from_unixtime(1430146422456 / 1000)

Convertissez date/heure (3) en horodatage en millisecondes:

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

Dans MariaDB, vous pouvez utiliser

SELECT NOW(4);

Pour obtenir des milisecs. Voir ici aussi.

1
Benvorth

Dans PostgreSQL nous utilisons cette approche:

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

Procédez comme suit en millisecondes:

select round(date_format(CURTIME(3), "%f")/1000)

Vous pouvez obtenir des microsecondes comme suit:

select date_format(CURTIME(6), "%f")
0
Justin Levene

J'ai rencontré le même problème récemment et j'ai créé un petit projet github contenant une nouvelle fonction mysql UNIX_TIMESTAMP_MS() qui renvoie l'horodatage actuel en millisecondes.

Aussi, vous pouvez faire ce qui suit:

SELECT UNIX_TIMESTAMP_MS(NOW(3)) ou SELECT UNIX_TIMESTAMP_MS(DateTimeField)

Le projet se trouve ici: https://github.com/silviucpp/unix_timestamp_ms

Pour compiler, vous devez simplement exécuter make compile à la racine du projet.

Ensuite, vous devez uniquement copier la bibliothèque partagée dans le /usr/lib/mysql/plugin/ (ou le dossier du plug-in situé sur votre ordinateur.)

Après cela, ouvrez simplement une console mysql et lancez:

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

J'espère que cela aidera, Silviu

0
silviu