【问题标题】:How to retrieve microseconds or milliseconds from MySQL current time?如何从 MySQL 当前时间检索微秒或毫秒?
【发布时间】:2013-03-09 17:27:33
【问题描述】:

我正在尝试在 MySQL 上创建我的第一个存储函数。在这个函数中,我想用 3 微秒数字返回当前日期和时间的时间戳,如下所示:YYYYMMDDHHMMSSZZZ

我在我的数据库中使用这个数字来为我的离线记录创建唯一键,这样当我的系统合并来自不同离线服务器的数据库时它们就不会崩溃。

所以我的第一次尝试是SELECT CAST(MICROSECOND(NOW()) AS CHAR(3));

但它返回 0。

如果我尝试SELECT CAST(MICROSECOND('2009-12-31 23:59:59.001210') AS CHAR(3));

根据需要返回 121。

那么,如何告诉 MySQL 我想知道当前时间的微秒?


编辑:

考虑一下:

CREATE FUNCTION CHAVE (pTable VARCHAR(32)) RETURNS CHAR(20)
BEGIN
    DECLARE vSigla CHAR(3);
    DECLARE vDateTime CHAR(14);
    DECLARE vMilli CHAR(3);
    DECLARE vKey CHAR(20);
    SET vSigla = (SELECT SIGLA FROM TABLELIST WHERE NOME = pTable);
    SET vDateTime = (SELECT CAST(LEFT(UTC_TIMESTAMP()+0, 14) AS CHAR(14)));
    SET vMilli = LPAD(FLOOR(RAND() * 1000), 3, '0');
    SET vKey = CONCAT(vSigla, vDateTime, vMilli);
    RETURN vKey;
END;

结果:

INSERT INTO TABLEX (dateID, name) VALUES (CHAVE('TABLEX'), 'EASI');

将是,来自 CHAVE('TABLEX'):

KEY20130320151159666

其中 666 将是一个随机数,但我希望它是当前时间的真实毫秒数,所以我没有可能的重复密钥。


如果我可以使用 SHOW COLUMNS FROM @TableName WHERE FIELD_NAME LIKE '%_ID' LIMIT 1 并将其插入非动态 SELECT 以获取该表最后一条记录的毫秒数...

【问题讨论】:

标签: mysql datetime milliseconds


【解决方案1】:

MySQL 5.6 支持sysdate 函数中的毫秒精度。

试试

select sysdate(6) 将返回 2013-04-16 13:47:56.273434

select sysdate(3) 将返回 2013-04-16 13:47:56.273

【讨论】:

【解决方案2】:

看看MySQL怎么说(http://dev.mysql.com/doc/refman/5.1/en/fractional-seconds.html):

However, when MySQL stores a value into a column of any temporal data type, it discards any fractional part and does not store it.

因此您需要将其存储为一个简单的浮点值,而不是日期值。

【讨论】:

  • 5.1 可能会这么说。 5.6 也这么说 - 但在一些重要方面扩展了这一点,所以关键问题是“OP 使用的是什么版本?”
  • 我不是在寻找存储空间,而只是从系统当前日期时间中检索,如问题中所述。我将它保存为字符串值 YYYYMMDDHHMMSSZZZ
  • 如果你的 MySQL 版本不够新,它将无法让任何部分变小 1 秒。最好使用您的服务器端脚本语言来检索它,然后放入查询中。
  • 所以我将无法创建该存储函数:-(
【解决方案3】:

对于 mysql 5.6

round(unix_timestamp() * 1000  + MICROSECOND(sysdate(6)) / 1000)

【讨论】:

  • 对我来说在 5.6.32 上效果很好。
【解决方案4】:

你也可以

mysql> select now(3) as millisecond, now(6) as microsecond, round(1000 * unix_timestamp(now(3))) elapsed_millisecond, round(unix_timestamp() * 1000  + MICROSECOND(now(6)) / 1000) elapsed_microsecond;
+-------------------------+----------------------------+---------------------+---------------------+
| millisecond             | microsecond                | elapsed_millisecond | elapsed_microsecond |
+-------------------------+----------------------------+---------------------+---------------------+
| 2019-12-10 11:49:43.568 | 2019-12-10 11:49:43.568767 |       1575949783568 |       1575949783569 |
+-------------------------+----------------------------+---------------------+---------------------+
1 row in set (0.01 sec)

【讨论】:

    【解决方案5】:

    这是我的毫秒级管理解决方案。

    我只是使用“文本”数据类型作为数据存储,因为你必须自己控制数据验证。

    创建表time_test ( id INT NOT NULL AUTO_INCREMENT , start_time 文本空, stop_time 文本空, difference 文本空, ranking INT NULL , 主键 (id) )

    插入time_test 值(NULL,'10:10:10.111111','10:10:10.456789',NULL,NULL) 插入time_test 值(NULL,'10:10:10.111111','10:10:20.777777',NULL,NULL) 插入time_test 值(NULL,'10:10:10.111111','10:10:01.999999',NULL,NULL)

    Now you can calculate like this 现在你可以这样计算 排序 SELECT * FROM time_test 按时间排序(stop_time)

    计算时间差异,对我来说非常好。 SELECT *, TIMEDIFF(stop_time,start_time) from time_test
    Calculate time diff, very good for me.

    还可以计算和存储你可以自己剪一些字符串。 更新 time_test 设置差异 = concat(TIMEDIFF(stop_time,start_time), MICROSECOND(TIMEDIFF(stop_time,start_time) )) also can calcuate and store back you can cut some string by yourself.

    您还可以通过以下命令进行排名: SET @r:=0;
    更新time_test SET 排名= (@r:= (@r+1)) ORDER BY difference ASC; you also doing ranking by this command:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-06-25
      • 2012-02-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-17
      相关资源
      最近更新 更多