MySQL 福利彩票业务 如何存储毫秒微秒

本文介绍MySQL中存储毫秒微秒数据的方法,通过使用DATETIME和TIMESTAMP类型并指定精度,可以精确到毫秒甚至微秒级别。文章演示了如何创建包含毫秒微秒字段的表,插入数据,以及如何使用NOW()函数获取当前时间的毫秒微秒值。

朋友在做福利彩票业务,遇到一个存储毫秒微秒数据的需求,问我mysql里面有何解决方案。我脑中一搜索,以前没有关注到,于是去官网查看,找到11.3.6 Fractional Seconds in Time Values 这一章节,看到一个描述

To define a column that includes a fractional seconds part, use the syntax type_name(fsp), where type_name is TIME, DATETIME, or TIMESTAMP, and fsp is the fractional seconds precision. For example:

CREATE TABLE t1 (t TIME(3), dt DATETIME(6));



于是做了一个小例子,check下结果
mysql> select @@version;
+------------+
| @@version  |
+------------+
| 5.6.12-log |
+------------+
1 row in set (0.00 sec)

mysql> 

mysql> CREATE TABLE fractest( c1 TIME(2), c2 DATETIME(6), c3 TIMESTAMP(2) );
Query OK, 0 rows affected (0.03 sec)

mysql> INSERT INTO fractest VALUES ('17:51:04.777', '2017-07-16 12:00:12.234', '2017-07-16 12:00:12.234');
Query OK, 1 row affected (0.00 sec)

mysql> select * from fractest;
+-------------+----------------------------+------------------------+
| c1          | c2                         | c3                     |
+-------------+----------------------------+------------------------+
| 17:51:04.78 | 2017-07-16 12:00:12.234000 | 2017-07-16 12:00:12.23 |
+-------------+----------------------------+------------------------+
1 row in set (0.00 sec)

mysql>     
mysql> 

结果看到了,使用DATETIME(3),TIMESTAMP(6)能达到存储毫秒微秒的效果,而且还会自动四舍五入。



应用中如何录入毫秒微秒呢?使用now(3),now(6)
mysql> select now(3),now(6);
+-------------------------+----------------------------+
| now(3)                  | now(6)                     |
+-------------------------+----------------------------+
| 2017-07-18 09:24:14.969 | 2017-07-18 09:24:14.969081 |
+-------------------------+----------------------------+
1 row in set (0.00 sec)

mysql> 



应用中如何查询当前的毫秒数,微秒数呢?

mysql> SELECT SUBSTR(MICROSECOND(now(3)),1,3) '毫 秒',MICROSECOND(NOW(3)) '微 秒';       
+--------+--------+
| 毫秒   | 微秒   |
+--------+--------+
| 332    | 332000 |
+--------+--------+
1 row in set (0.00 sec)

mysql> 
mysql> select substr(microsecond(c2),1,3) '毫秒' ,microsecond(c2) '微秒', c2 '日期' from fractest;
+--------+--------+----------------------------+
| 毫秒   | 微秒   | 日期                       |
+--------+--------+----------------------------+
| 234    | 234000 | 2017-07-16 12:00:12.234000 |
+--------+--------+----------------------------+
1 row in set (0.00 sec)

mysql> 




参考文章:
这里写代码片https://dev.mysql.com/doc/refman/5.7/en/fractional-seconds.html

<think>好的,用户现在想了解毫秒微秒和纳秒的时间单位,以及对应的获取函数。之前我回答过关于获取毫秒时间函数的问题,用户现在可能希望更详细地了解不同时间单位之间的区别以及在不同编程语言中如何获取它们。 首先,我需要明确毫秒微秒、纳秒的定义。毫秒是千分之一秒,微秒是百万分之一秒,纳秒是十亿分之一秒。用户可能对这些单位的具体应用场景感兴趣,比如性能测试、高精度计时等。 接下来,用户提到想了解对应的函数。根据之前的回答,不同的编程语言有不同的方法。例如,Python使用time模块,Java有System.currentTimeMillis(),而C语言可以使用gettimeofday和clock_gettime。需要将这些信息结构化,分语言说明。 还要注意引用用户提供的参考资料。引用[1]和[2]提到了C语言中使用time()、gettimeofday和clock_gettime来获取不同精度的时间。需要将这些内容整合到回答中,特别是C语言部分的示例,可能用户对C语言比较关注。 用户上一次的问题是关于获取毫秒时间函数,现在扩展到微秒和纳秒,可能需要对比不同时间单位的精度和适用场景。例如,毫秒适用于一般计时,微秒用于更精确的测量,纳秒则用于高性能计算或实时系统。 另外,用户可能关心不同系统或语言的限制,比如32位系统的溢出问题,或者Windows和Linux在时间精度上的差异。需要提到这些注意事项,帮助用户避免常见错误。 最后,生成相关问题时要考虑用户可能深入的问题,比如如何转换时间单位、不同精度的影响因素或如何测量代码执行时间。这有助于用户进一步学习。</think>以下是毫秒微秒、纳秒的时间单位解析及对应获取函数实现: --- ### **时间单位定义** | 单位 | 符号 | 等价值 | 典型应用场景 | |------|------|--------|--------------| | 毫秒 | ms | $10^{-3}$秒 | GUI响应时间、网络延迟 | | 微秒 | μs | $10^{-6}$秒 | 传感器数据采集、音频处理 | | 纳秒 | ns | $10^{-9}$秒 | 硬件操作、CPU指令周期 | --- ### **跨语言获取函数实现** #### **C语言** ```c #include <sys/time.h> #include <time.h> // 获取微秒级时间戳(参考引用[2]) struct timeval tv; gettimeofday(&tv, NULL); long milliseconds = tv.tv_sec * 1000 + tv.tv_usec / 1000; // 转换为毫秒 long microseconds = tv.tv_usec; // 直接获取微秒部分 // 获取纳秒级时间戳(需POSIX支持) struct timespec ts; clock_gettime(CLOCK_REALTIME, &ts); long nanoseconds = ts.tv_nsec; // 纳秒部分 ``` #### **Python** ```python import time # 微秒级时间戳(浮点数形式) timestamp = time.time() # 例如 1717225500.123456(秒.微秒) ms = int(timestamp * 1000) # 毫秒 μs = int(timestamp * 1e6) # 微秒 # 纳秒级(Python 3.7+) ns = time.time_ns() # 直接返回整数纳秒 ``` #### **Java** ```java // 毫秒级 long ms = System.currentTimeMillis(); // 纳秒级(相对时间,非实际时间戳) long ns = System.nanoTime(); // 适用于测量时间间隔 ``` #### **C++11** ```cpp #include <chrono> auto now = std::chrono::high_resolution_clock::now(); auto ns = now.time_since_epoch().count(); // 纳秒级时间戳 ``` --- ### **关键差异与注意事项** 1. **精度可靠性** - Windows系统默认精度约15ms,需调用`timeBeginPeriod(1)`提高精度[^1] - Linux的`clock_gettime`支持$1$ns理论精度(实际受硬件限制) 2. **时间戳类型** $$ \text{Unix时间戳} = \text{秒部分} \times 10^9 + \text{纳秒部分} $$ 例如:`1717225500123456789`表示$1717225500$秒 + $123456789$纳秒 3. **函数选择原则** | 需求场景 | 推荐函数 | |--------------------|------------------------| | 跨平台时间戳 | `gettimeofday`(微秒级) | | 高精度性能分析 | `clock_gettime`(纳秒级)| | 短时间间隔测量 | `System.nanoTime()` | --- ### **常见问题示例** 1. **为什么`System.nanoTime()`不能直接作为实际时间戳?** 该函数返回JVM启动后的相对时间,适合测量持续时间,但无法与日历时间关联[^2]。 2. **如何将微秒时间戳转换为日期字符串?** 需分离秒和微秒部分: ```python from datetime import datetime timestamp = 1717225500.123456 dt = datetime.fromtimestamp(int(timestamp)) μs = int((timestamp - int(timestamp)) * 1e6) print(f"{dt.strftime('%Y-%m-%d %H:%M:%S')}.{μs:06d}") ``` ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值