CURRENT_TIMESTAMP в миллисекундах - PullRequest
57 голосов
/ 09 марта 2012

Есть ли способ получить миллисекунды из отметки времени в MySql или PostgreSql (или других просто из любопытства)?

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

Есть ли что-то вроде этого:

SELECT CURRENT_MILLISEC
--> 1331255526000

или единственной альтернативой является использование DATEDIFF из era?

Ответы [ 16 ]

49 голосов
/ 11 января 2015

Для MySQL (5.6+) вы можете сделать это:

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

Который вернется (например,):

1420998416685 --milliseconds
36 голосов
/ 09 марта 2012

Чтобы получить метку времени Unix в секундах в MySQL:

select UNIX_TIMESTAMP();

Детали: http://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html#function_unix-timestamp

Не тестировал PostgreSQL, но согласно этому сайту он должен работать: http://www.raditha.com/postgres/timestamp.php

select round( date_part( 'epoch', now() ) );
33 голосов
/ 17 сентября 2014

В mysql можно использовать функцию uuid для извлечения миллисекунд.

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;

Результат:

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

Это также работает в более старых версиях mysql!

Спасибо за эту страницу: http://rpbouman.blogspot.com.es/2014/06/mysql-extracting-timstamp-and-mac.html

9 голосов
/ 31 марта 2017

В Mysql 5.7+ вы можете выполнить

select current_timestamp(6)

для более подробной информации

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

8 голосов
/ 09 марта 2012

Правильный способ извлечения миллисекунд из значения метки времени в PostgreSQL согласно текущей документации :

SELECT date_part('milliseconds', current_timestamp);

--OR

SELECT EXTRACT(MILLISECONDS FROM current_timestamp);

с возвратами: поле секунд, включая дробные части, умноженное на 1000Обратите внимание, что это включает полные секунды.

6 голосов
/ 21 августа 2013

Использование:

Select curtime(4);

Это даст вам миллисекунды.

5 голосов
/ 18 января 2018

Основное недоразумение в MySQL с метками времени состоит в том, что MySQL по умолчанию возвращает и сохраняет метки времени без дробной части .

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

, которое можно преобразовать в метку времени в секундах как

SELECT UNIX_TIMESTAMP(current_timestamp()) => 1516272429

Добавить дробную часть:

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

, которая может быть преобразована в метку времени в микросекундах как

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

Есть несколько трюков с хранением в таблицах. Если ваша таблица была создана как

    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;

чем MySQL НЕ будет хранить в нем дробную часть:

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

Если вы хотите добавить дробную часть в вашу таблицу, вам нужно создать свою таблицу другим способом:

    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;

, что приводит к требуемому результату:

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

функция current_timestamp () может получать значение до 6, но я обнаружил (по крайней мере, в моей установленной версии MySQL 5.7.11 для Windows), что точность дроби 6 приводит к тому же постоянному значению 3 цифры в хвост, в моем случае 688

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

Это означает, что реально используемая точность меток времени MySQL зависит от платформы:

  • в Windows: 3
  • в Linux: 6
4 голосов
/ 27 февраля 2015

Ни один из этих ответов действительно не решает проблему в postgreSQL , то есть:

, получая unix timestamp поля даты в миллисекундах

У меня возникла та же проблема, и я проверил различные предыдущие ответы без удовлетворения результата.

Наконец, я нашел действительно простой способ, возможно, самый простой:

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

, а именно:

  • Извлекаем из нашей приведенной колонки pgSQL EPOCH , т.е. unix timestamp в с плавающей запятой в осторожности с отметкой времени (в некоторых сложных запросах pgSQL может выдать ошибку, если это приведение не является явным. См.)
  • , затем мы приводим его к плавающей запятой и умножаем на 1000, чтобы получить значение в миллисекундах
4 голосов
/ 30 мая 2014

Вот выражение, которое работает для MariaDB и MySQL> = 5.6:

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

Это зависит от того факта, что NOW () всегда возвращает одно и то же время в запросе ; Вполне возможно, что просто UNIX_TIMESTAMP() будет работать, я не уверен, на основе документации . Также требуется MySQL> = 5.6 для нового аргумента точности для функции NOW() (тоже работает MariaDB).

4 голосов
/ 09 марта 2012

В PostgreSQL вы можете использовать:

SELECT extract(epoch from now());

на MySQL:

SELECT unix_timestamp(now());
...