CURRENT_TIMESTAMP,以毫秒为单位

时间:2012-03-08 20:19:21

标签: mysql sql postgresql datetime timestamp

有没有办法从MySqlPostgreSql(或其他只是出于好奇心)的时间戳中获得毫秒数?

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

有这样的事吗:

SELECT CURRENT_MILLISEC
--> 1331255526000

或唯一的选择是使用DATEDIFF中的era

20 个答案:

答案 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真正可用的时间戳精度取决于平台:

    Windows上的
  • :3
  • on Linux:6

答案 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>

即:

  • 我们从时间戳谨慎的列中提取pgSQL EPOCH ,即 unix timestamp floatting seconds (在某些复杂查询中,pgSQL如果此演员表不明确,可能会出错。参见)
  • 然后我们将它转​​换为float并将其乘以1000以获得以毫秒为单位的值

答案 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)

在MariaDB中,您可以使用

SELECT NOW(4);

获得诅咒。另见here

答案 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)