有没有办法从MySql
或PostgreSql
(或其他只是出于好奇心)的时间戳中获得毫秒数?
SELECT CURRENT_TIMESTAMP
--> 2012-03-08 20:12:06.032572
有这样的事吗:
SELECT CURRENT_MILLISEC
--> 1331255526000
或唯一的选择是使用DATEDIFF
中的era
?
答案 0 :(得分:46)
对于MySQL(5.6+),你可以这样做:
SELECT ROUND(UNIX_TIMESTAMP(CURTIME(4)) * 1000)
将返回(例如):
1420998416685 --milliseconds
答案 1 :(得分:37)
在MySQL中获取Unix时间戳秒:
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 :(得分:32)
在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
答案 3 :(得分:10)
在Mysql 5.7+中你可以执行
multi_user_map.js
了解更多详情
https://dev.mysql.com/doc/refman/5.7/en/fractional-seconds.html
答案 4 :(得分:8)
从PostgreSQL上的时间戳值相应地向current documentation提取毫秒的正确方法是:
SELECT date_part('milliseconds', current_timestamp);
--OR
SELECT EXTRACT(MILLISECONDS FROM current_timestamp);
带回车的:秒字段,包括小数部分,乘以1000.请注意,这包括整秒。
答案 5 :(得分:6)
使用:
Select curtime(4);
这将给你毫秒。
答案 6 :(得分:5)
海报要求从纪元开始的整数值,而不是从纪元开始的时间或S值。
为此,您需要使用NOW(3)
,以秒为单位的时间为3个小数位(即MS精度): 2020-02-13 16:30:18.236 < / p>
然后UNIX_TIMESTAMP(NOW(3))
将时间缩短到epoc之后的几分之一秒:
1581611418.236
最后,FLOOR(UNIX_TIMESTAMP(NOW(3))*1000)
将其转换为一个不错的整数,从epoc开始持续ms:
1581611418236
使其具有MySQL功能:
CREATE FUNCTION UNIX_MS() RETURN BIGINT DETERMINISTIC
BEGIN
RETURN FLOOR(UNIX_TIMESTAMP(NOW(3))*1000);
END
现在运行SELECT UNIX_MS();
注意:这都是手工复制的,因此如果有错误,请随时解决;)
答案 7 :(得分:5)
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的值,但我发现(至少在Windows上安装的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真正可用的时间戳精度取决于平台:
答案 8 :(得分:4)
这是一个适用于MariaDB和MySQL的表达式&gt; = 5.6:
SELECT (UNIX_TIMESTAMP(NOW()) * 1000000 + MICROSECOND(NOW(6))) AS unix_now_in_microseconds;
这取决于NOW() always returns the same time throughout a query;普通的UNIX_TIMESTAMP()
可能会起作用,我不确定based on the documentation。对于NOW()
函数的新精度参数,它还需要MySQL&gt; = 5.6(MariaDB也适用)。
答案 9 :(得分:4)
这些回复都没有真正解决postgreSQL中的问题,即:
获取日期字段的 unix时间戳(以毫秒为单位)
我遇到了同样的问题并测试了之前不同的回复而没有令人满意的结果。
最后,我找到了一种非常简单的方法,可能是最简单的方法:
SELECT (EXTRACT (EPOCH FROM <date_column>::timestamp)::float*1000 as unix_tms
FROM <table>
即:
答案 10 :(得分:4)
在PostgreSQL中你可以使用:
SELECT extract(epoch from now());
关于MySQL:
SELECT unix_timestamp(now());
答案 11 :(得分:3)
我发现在MySql中以毫秒为单位获取当前时间的最简单方法:
SELECT (UNIX_TIMESTAMP(NOW(3)) * 1000)
自MySql 5.6。
答案 12 :(得分:1)
Postgres:SELECT (extract(epoch from now())*1000)::bigint;
答案 13 :(得分:1)
对于mysql:
SELECT (UNIX_TIMESTAMP() * 1000) AS unix_now_in_microseconds; --- 1600698677000
答案 14 :(得分:1)
答案 15 :(得分:1)
我觉得有必要继续改进,所以在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)
将datetime(3)转换为时间戳(以毫秒为单位):
floor(unix_timestamp("2015-04-27 14:53:42.456") * 1000)
答案 16 :(得分:0)
我最近遇到了同样的问题,我创建了一个小的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';
我希望这会有所帮助, 西尔维乌
答案 17 :(得分:0)
请执行以下操作(以毫秒为单位):
select round(date_format(CURTIME(3), "%f")/1000)
您可以通过以下方法获得微秒:
select date_format(CURTIME(6), "%f")
答案 18 :(得分:0)
对于这里的每个人,只需收听/阅读Doin的评论就可以了!当给出数据时间字符串时,UNIX_TIMESTAMP()
函数将根据MySQL连接或服务器的时区,将本地时间与unix时间戳联系。如果在不同时区处理夏令时(每年一小时),这将会出错!
例如,在荷兰,10月的最后一个星期日,这是首次到达02:59:59之后的一秒钟,该时间将重新设置为02:00:00。当使用MySQL的NOW()
,CURTIME()
或SYSDATE()
函数并将其传递给UNIX_TIMESTAMP()
函数时,整个我们的时间戳都是错误的。
例如,在2018年10月27日星期六的时间和时间戳上是这样的:
Local time | UTC Time | Timestamp | Timestamp using MYSQL's UNIX_TIMESTAMP(NOW(4))
----------------------------------+---------------------------+--------------+-----------------------------------------------------
2018-10-27 01:59:59 CET (+02:00) | 2018-10-26 23:59:59 UTC | 1540598399 | 1540598399
2018-10-27 02:00:00 CET (+02:00) | 2018-10-27 00:00:00 UTC | 1540598400 | 1540598400 + 1 second
2018-10-27 02:59:59 CET (+02:00) | 2018-10-27 00:59:59 UTC | 1540601999 | 1540601999
2018-10-27 03:00:00 CET (+02:00) | 2018-10-27 01:00:00 UTC | 1540602000 | 1540602000 + 1 second
2018-10-27 03:59:59 CET (+02:00) | 2018-10-27 01:59:59 UTC | 1540605599 | 1540605599
2018-10-27 04:00:00 CET (+02:00) | 2018-10-27 02:00:00 UTC | 1540605600 | 1540605600 + 1 second
但是在2019年10月27日星期日,我们将时钟调整了一个小时。因为本地时间不包含+02:00或+01:00的信息,所以将第一时间和第二时间的时间02:00:00转换为第一时间和第二时间都是相同的(从第二时间02:00开始) :00),则使用MYSQL的UNIX_TIMESTAMP(NOW(4))
函数。因此,在检查数据库中的时间戳时,它是这样做的:+1 +1 +3601 +1 +1 ... +1 +1 -3599 +1 +1等。
Local time | UTC Time | Timestamp | Timestamp using MYSQL's UNIX_TIMESTAMP(NOW(4))
----------------------------------+---------------------------+--------------+-----------------------------------------------------
2019-10-27 01:59:59 CET (+02:00) | 2019-10-26 23:59:59 UTC | 1572134399 | 1572134399
2019-10-27 02:00:00 CET (+02:00) | 2019-10-27 00:00:00 UTC | 1572134400 | 1572138000 + 3601 seconds
2019-10-27 02:59:59 CET (+02:00) | 2019-10-27 00:59:59 UTC | 1572137999 | 1572141599
2019-10-27 02:00:00 CET (+01:00) | 2019-10-27 01:00:00 UTC | 1572138000 | 1572138000 - 3599 seconds
2019-10-27 02:59:59 CET (+01:00) | 2019-10-27 01:59:59 UTC | 1572141599 | 1572141599
2019-10-27 03:00:00 CET (+01:00) | 2019-10-27 02:00:00 UTC | 1572141600 | 1572141600 + 1 second
不幸的是,在转换本地时间时,从MySQL依赖UNIX_TIMESTAMP()函数非常不可靠!现在,我们不再使用SELECT UNIX_TIMESTAMP(NOW(4))
,而是使用下面的代码来解决该问题。
SELECT ROUND(UNIX_TIMESTAMP() + (MICROSECOND(UTC_TIME(6))*0.000001), 4)
答案 19 :(得分:0)
在 PostgreSQL 中,我们使用这种方法:
SELECT round(EXTRACT (EPOCH FROM now())::float*1000)