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
?
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() ) );
Pour MySQL (5.6+), vous pouvez faire ceci:
SELECT ROUND(UNIX_TIMESTAMP(CURTIME(4)) * 1000)
Ce qui retournera (par exemple):
1420998416685 --milliseconds
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
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
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.
Utilisation:
Select curtime(4);
Cela vous donnera des millisecondes.
Dans PostgreSQL, vous pouvez utiliser:
SELECT extract(Epoch from now());
sur MySQL:
SELECT unix_timestamp(now());
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).
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:
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:
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.
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)
Dans PostgreSQL nous utilisons cette approche:
SELECT round(EXTRACT (Epoch FROM now())::float*1000)
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")
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