jdbctypetimestamp_数据库中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):

jdbcType为time,Java获取类型为java.sql.Date,所有信息都会丢失输出为:1970-01-01 00:00:00

jdbcType为date,Java获取类型为java.sql.Time,所有信息都会丢失输出为:1970-01-01 00:00:00

timestamp分为date和time两部分,date部分"最原始"的值为:1970-01-01, time部分"最原始"的值为:00:00:00

只会从数据库获取已有的部分来匹配自己需要的部分,自己不需要的部分设置为"最原始的值"。

如果满足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()));

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值