我正在尝试在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中插入它以获得该表的最后一条记录的毫秒......
答案 0 :(得分:26)
MySQL 5.6支持sysdate
函数的毫秒精度。
尝试
select sysdate(6)
将返回2013-04-16 13:47:56.273434
和
select sysdate(3)
将返回2013-04-16 13:47:56.273
答案 1 :(得分:5)
看看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.
因此,您需要将其存储为日期值,而不是存储为简单的浮点值。
答案 2 :(得分:4)
对于mysql 5.6
round(unix_timestamp() * 1000 + MICROSECOND(sysdate(6)) / 1000)
答案 3 :(得分:0)
还可以
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)
答案 4 :(得分:-2)
这是我的毫秒管理解决方案。
我只是使用“文本”数据类型作为数据存储,因为您必须自己控制数据验证。
创建表time_test
(
id
INT NOT NULL AUTO_INCREMENT,
start_time
TEXT NULL,
stop_time
TEXT NULL,
difference
TEXT NULL,
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)
计算时间差,对我来说非常好。
从time_test
中选择SELECT *,TIMEDIFF(stop_time,start_time)
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: