[MYSQL] 时间类型 TIME, DATETIME, TIMESTAMP精度问题——小心四舍五入

如果定义一个字段,包含小数部分秒(fractional seconds part)。那么可以使用**type_name(fsp)**这种方式。type_name 可以使TIME, DATETIME, 或者 TIMESTAMP。fsp小数部分秒的精度(取值为0~6)。
如下,可以看到用法。

CREATE TABLE fractest( c1 TIME(2), c2 DATETIME(2), c3 TIMESTAMP(2), c4 TIMESTAMP);
INSERT INTO fractest VALUES
('17:51:04.777', '2018-09-08 17:51:04.777', '2018-09-08 17:51:04.777','2018-09-08 17:51:04.777');
mysql> SELECT * FROM fractest;
+-------------+------------------------+------------------------+---------------------+
| c1          | c2                     | c3                     | c4                  |
+-------------+------------------------+------------------------+---------------------+
| 17:51:04.78 | 2018-09-08 17:51:04.78 | 2018-09-08 17:51:04.78 | 2018-09-08 17:51:05 |
+-------------+------------------------+------------------------+---------------------+

从上面的结果可以看到,TIME, DATETIME, TIMESTAMP之间有很大的差别。另外从c3,c4可以看到使用精度和默认值(不显式定义精度)之间的差别。

这些差别在实际使用中很可能因为精度丢失产生bug。如,java中的LocalDateTime默认的精度是3位(2020-01-14T16:51:30.728),若数据库设置默认精度,则将四舍五入,时间变为2020-01-14T16:51:31。

其他

时间处理函数文档:https://dev.mysql.com/doc/refman/8.0/en/date-and-time-functions.html


参考:
https://dev.mysql.com/doc/refman/5.6/en/fractional-seconds.html
https://dev.mysql.com/doc/refman/8.0/en/fractional-seconds.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MySQL中,时间类型有四种,分别是DATETIME、DATE、TIMETIMESTAMP,这些类型在Java中的转换方式如下: 1. DATETIME类型 在Java中,可以使用java.time.LocalDateTime类来表示DATETIME类型。在通过JDBC从MySQL中读取DATETIME类型的值时,可以使用ResultSet类的getTimestamp方法获取java.sql.Timestamp类型的值,然后再将其转换为java.time.LocalDateTime类型: ```java ResultSet rs = stmt.executeQuery("SELECT datetime_column FROM table"); while (rs.next()) { Timestamp timestamp = rs.getTimestamp("datetime_column"); LocalDateTime datetime = timestamp.toLocalDateTime(); // ... } ``` 在将java.time.LocalDateTime类型的值写入到MySQLDATETIME类型的字段时,可以使用PreparedStatement类的setTimestamp方法: ```java PreparedStatement pstmt = conn.prepareStatement("INSERT INTO table (datetime_column) VALUES (?)"); LocalDateTime datetime = LocalDateTime.now(); Timestamp timestamp = Timestamp.valueOf(datetime); pstmt.setTimestamp(1, timestamp); pstmt.executeUpdate(); ``` 2. DATE类型 在Java中,可以使用java.time.LocalDate类来表示DATE类型。在通过JDBC从MySQL中读取DATE类型的值时,可以使用ResultSet类的getDate方法获取java.sql.Date类型的值,然后再将其转换为java.time.LocalDate类型: ```java ResultSet rs = stmt.executeQuery("SELECT date_column FROM table"); while (rs.next()) { Date date = rs.getDate("date_column"); LocalDate localDate = date.toLocalDate(); // ... } ``` 在将java.time.LocalDate类型的值写入到MySQL的DATE类型的字段时,可以使用PreparedStatement类的setDate方法: ```java PreparedStatement pstmt = conn.prepareStatement("INSERT INTO table (date_column) VALUES (?)"); LocalDate localDate = LocalDate.now(); Date date = Date.valueOf(localDate); pstmt.setDate(1, date); pstmt.executeUpdate(); ``` 3. TIME类型 在Java中,可以使用java.time.LocalTime类来表示TIME类型。在通过JDBC从MySQL中读取TIME类型的值时,可以使用ResultSet类的getTime方法获取java.sql.Time类型的值,然后再将其转换为java.time.LocalTime类型: ```java ResultSet rs = stmt.executeQuery("SELECT time_column FROM table"); while (rs.next()) { Time time = rs.getTime("time_column"); LocalTime localTime = time.toLocalTime(); // ... } ``` 在将java.time.LocalTime类型的值写入到MySQLTIME类型的字段时,可以使用PreparedStatement类的setTime方法: ```java PreparedStatement pstmt = conn.prepareStatement("INSERT INTO table (time_column) VALUES (?)"); LocalTime localTime = LocalTime.now(); Time time = Time.valueOf(localTime); pstmt.setTime(1, time); pstmt.executeUpdate(); ``` 4. TIMESTAMP类型 在Java中,可以使用java.time.LocalDateTime类来表示TIMESTAMP类型。在通过JDBC从MySQL中读取TIMESTAMP类型的值时,可以使用ResultSet类的getTimestamp方法获取java.sql.Timestamp类型的值,然后再将其转换为java.time.LocalDateTime类型: ```java ResultSet rs = stmt.executeQuery("SELECT timestamp_column FROM table"); while (rs.next()) { Timestamp timestamp = rs.getTimestamp("timestamp_column"); LocalDateTime datetime = timestamp.toLocalDateTime(); // ... } ``` 在将java.time.LocalDateTime类型的值写入到MySQLTIMESTAMP类型的字段时,可以使用PreparedStatement类的setTimestamp方法: ```java PreparedStatement pstmt = conn.prepareStatement("INSERT INTO table (timestamp_column) VALUES (?)"); LocalDateTime datetime = LocalDateTime.now(); Timestamp timestamp = Timestamp.valueOf(datetime); pstmt.setTimestamp(1, timestamp); pstmt.executeUpdate(); ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值