CURRENT_TIMESTAMP в миллисекундах
Есть ли способ получить миллисекунды из метки времени в MySql
или PostgreSql
(или других просто из любопытства)?
SELECT CURRENT_TIMESTAMP
--> 2012-03-08 20:12:06.032572
Есть ли что-то вроде этого:
SELECT CURRENT_MILLISEC
--> 1331255526000
или единственной альтернативой является использование DATEDIFF
из era
?
Ответы
Ответ 1
Чтобы получить временную метку 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() ) );
Ответ 2
Для MySQL (5.6+) вы можете сделать это:
SELECT ROUND(UNIX_TIMESTAMP(CURTIME(4)) * 1000)
Что вернется (например,):
1420998416685 --milliseconds
Ответ 3
В 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
Ответ 4
Правильный способ извлечения миллисекунд из значения временной метки в PostgreSQL в соответствии с текущей документацией:
SELECT date_part('milliseconds', current_timestamp);
--OR
SELECT EXTRACT(MILLISECONDS FROM current_timestamp);
с возвратом: поле секунд, включая дробные части, умноженное на 1000. Обратите внимание, что это включает полные секунды.
Ответ 5
Использование:
Select curtime(4);
Это даст вам миллисекунды.
Ответ 6
В Mysql 5. 7+ вы можете выполнить
select current_timestamp(6)
Больше подробностей
https://dev.mysql.com/doc/refman/5.7/en/fractional-seconds.html
Ответ 7
В PostgreSQL вы можете использовать:
SELECT extract(epoch from now());
в MySQL:
SELECT unix_timestamp(now());
Ответ 8
Ни один из этих ответов действительно не решает проблему в postgreSQL, т.е.
получение unix timestamp поля даты в миллисекундах
У меня была та же проблема и протестировало разные предыдущие ответы без удовлетворения результата.
Наконец, я нашел действительно простой способ, возможно, самый простой:
SELECT (EXTRACT (EPOCH FROM <date_column>::timestamp)::float*1000 as unix_tms
FROM <table>
а именно:
- Мы извлекаем pgSQL EPOCH, т.е. временную метку unix, в полях с плавающей запятой из нашего столбца, заброшенного в основе временной отметки (в некоторых сложных запросах pgSQL может вызывать ошибку, если этот приведение не является явным).
- тогда мы будем использовать его в float и умножим его на 1000, чтобы получить значение в миллисекундах
Ответ 9
Здесь выражение, которое работает для 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).
Ответ 10
Самый простой способ найти текущее время в миллисекундах в MySql:
SELECT (UNIX_TIMESTAMP(NOW(3)) * 1000)
Так как MySql 5.6.
Ответ 11
Основное недоразумение в 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), что точность фракции 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 равна 3.
Ответ 12
Я чувствовал необходимость продолжать совершенствовать, поэтому в 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)
Ответ 13
В MariaDB вы можете использовать
SELECT NOW(4);
Получить milisecs. См. здесь.
Ответ 14
В PostgreSQL мы используем этот подход:
SELECT round(EXTRACT (EPOCH FROM now())::float*1000)
Ответ 15
Недавно я столкнулся с той же проблемой, и создал небольшой проект 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';
Надеюсь, это поможет,
Silviu
Ответ 16
В MySQL:
SELECT UNIX_TIMESTAMP() * 1000;