数据库中date、time和timestamp类型读取和写入

存储格式

date:yyyy-mm-dd
time:hh:mm:ss
timestamp:yyyy-mm-dd hh:mm:ss

对应Java类型

date:java.sql.Date
time:java.sql.Time
timestamp:java.sql.Timestamp
上述三种类型都是继承自java.util.Date,所以Java中获取的结果最后都是转换为java.util.Date进行处理的,转换之后对应的时间(long)是不变的。

Java利用JDBC从数据库中获取日期数据

相关建表语句:

CREATE TABLE `time_table` (
  `date1` date DEFAULT NULL,
  `time1` time DEFAULT NULL,
  `timestamp1` timestamp NULL 
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

INSERT INTO `time_table` VALUES ('2020-08-04', '14:49:54', '2020-07-22 14:49:56');

此时数据库中的数据为:
image.png

Java从数据库中读取日期的数据的时候可能会有类型转换,例如jdbcType为timestamp而Java读取的数据类型是java.sql.Time,jdbcType为date而Java读取的数据类型是java.sql.TimeStamp。
不同类型的转换遵从以下原则(以下的输出都是转换为java.util.Date进行输出格式为:yyyy-MM-dd HH:mm:ss):

  1. jdbcType为time,Java获取类型为java.sql.Date,所有信息都会丢失输出为:1970-01-01 00:00:00
  2. jdbcType为date,Java获取类型为java.sql.Time,所有信息都会丢失输出为:1970-01-01 00:00:00
  3. timestamp分为date和time两部分,date部分"最原始"的值为:1970-01-01, time部分"最原始"的值为:00:00:00
  4. 只会从数据库获取已有的部分来匹配自己需要的部分,自己不需要的部分设置为"最原始的值"。

如果满足1或者2则不会用到规则3和4
针对规则4用以下例子进行说明

  • timestamp1已有的部分为date和time,java.sql.Time需要的部分为time,不需要的部分为date,所以输出为1970-01-01 16:07:22
java.sql.Time sqlTime2 = rs.getTime("timestamp1");
Date javaDate = new Date(sqlTime2.getTime());
System.out.println(dateFormat.format(javaDate));
  • time1已有的部分为time,java.sql.Time所需要的部分为time,不需要的部分为date,所以输出为1970-01-01 14:49:54
java.sql.Time sqlTime1 = rs.getTime("time1");
Date javaDate = new Date(sqlTime1.getTime());
System.out.println(dateFormat.format(javaDate));

总结

数据库字段最好用timestamp并且获取数据的时候不要用java.sql.Time,这样才最有可能保证数据的准确性。
感觉time类型没什么用。

JDBC向数据库中写数据

向数据库中写数据的时候一般是将java.util.Date转换为相应的格式,基本上可以正确的设置,代码片段如下:

Connection coon = DriverManager.getConnection(URL, name, Password);
String sql = "INSERT INTO `time_table` VALUES (?, ?, ?)";
PreparedStatement preparedStatement = coon.prepareStatement(sql);
Date javaDate = new Date();
// 类型正常成功设置。
preparedStatement.setDate(1, new java.sql.Date(javaDate.getTime()));
preparedStatement.setTime(2, new java.sql.Time(javaDate.getTime()));
preparedStatement.setTimestamp(3, new java.sql.Timestamp(javaDate.getTime()));
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。