it-swarm.com.ru

CURRENT_TIMESTAMP в миллисекундах

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

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

Есть что-нибудь подобное:

SELECT CURRENT_MILLISEC
--> 1331255526000

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

51
Gevorg

Чтобы получить метку времени 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() ) );
38
Billy Moon

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

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

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

1420998416685 --milliseconds
45
Claudio Holanda

В 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

31
jbaylina

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

select current_timestamp(6)

больше подробностей

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

8
Ahmed

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

SELECT date_part('milliseconds', current_timestamp);

--OR

SELECT EXTRACT(MILLISECONDS FROM current_timestamp);

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

7
Falco

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

Select curtime(4);

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

6
TanuAD

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

SELECT extract(Epoch from now());

на MySQL:

SELECT unix_timestamp(now());
4
aleroot

Вот выражение, которое работает для 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
Walter Mundt

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

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

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

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

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

а именно:

  • Мы извлекаем pgSQL Epoch, то есть unix timestamp в floatting секунд из нашего столбца, приведенного с осторожностью временных меток (в некоторых сложных запросах pgSQL может выдавать ошибку, если это приведение не является явным. Увидеть )
  • затем мы приводим его в float и умножаем на 1000, чтобы получить значение в миллисекундах
4
Rémi Becheras

Основное недоразумение в 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
Igor

Самый простой способ найти текущее время в миллисекундах в MySql:

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

Начиная с MySql 5.6.

3
Yuval

Я чувствовал необходимость продолжать дорабатывать, поэтому в MySQL:

Текущая временная метка в миллисекундах:

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

Отметка времени в миллисекундах от заданной даты-времени (3):

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

Преобразовать метку времени в миллисекундах в datetime (3):

from_unixtime(1430146422456 / 1000)

Преобразовать дату и время (3) в метку времени в миллисекундах:

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

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

SELECT NOW(4);

Чтобы получить милисек. Смотрите здесь тоже.

1
Benvorth

В PostgreSQL мы используем такой подход:

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

Для миллисекунд выполните следующие действия:

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

Вы можете получить микросекунды следующим образом:

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

Недавно я столкнулся с той же проблемой и создал небольшой проект на github, который содержит новую функцию mysql UNIX_TIMESTAMP_MS(), которая возвращает текущую метку времени в миллисекундах.

Также вы можете сделать следующее:

SELECT UNIX_TIMESTAMP_MS(NOW(3)) или SELECT UNIX_TIMESTAMP_MS(DateTimeField)

Проект находится здесь: https://github.com/silviucpp/unix_timestamp_ms

Для компиляции вам нужно просто запустить make compile в корне проекта.

Затем вам нужно только скопировать разделяемую библиотеку в /usr/lib/mysql/plugin/ (или в любую папку с плагинами на вашем компьютере).

После этого просто откройте консоль mysql и запустите:

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

Я надеюсь, что это поможет, Сильвиу

0
silviu