解决数据库中插入时间丢失时分秒(关于Mi和MM两个见文底)

java.util.Date转换为java.sql.Date带时分秒 
java.util.Date需要转换为java.sql.Date,常规的方式转换过来只可以得到年月日,如若要取得时分秒,可以用Date的子类Timestamp

Java在向数据库中插入时间的时候,常常遇到时、分、秒丢失的情况,这种情况的发生一般是由于时间日期对象使用错误造成的。

java.util.Date是不能直接插入数据库中的,虽然它包含了日期和时分秒。java.sql.Date可以直接插入数据库,但是它只有日期而没有时间;java.sql.Time可以直接插入数据库,但是它只有时间,没有日期;以上这些往往不能满足我们的需要。

如果我们要插入日期和时间,那么就要相办法来使用java.sql.Timestamp来向数据库插入。java.sql.Timestamp可包含了日前和到毫秒的时间值,在程序中,我们常常是使用的java.util.Date,所以就要有解决的方法来实现。

有如下方法将java.util.Date转化为java.sql.Timestamp

public java.sql.Timestamp getTimestamp(Date date) {
return new java.sql.Timestamp(date.getTime());
}

这样,我们可以将我们使用的java.util.Date转化,然后插入数据库,便可以解决时、分、秒丢失的问题。


由此可以看到我们向数据库传入或传出值是尽量不要使用getDate方法或setDate方法,这样会丢失数据,解决的办法是:
一、改用java.sql.Timestamp 
二、传日期形式的字符串,在存储过程接收到后在存储过程中使用to_date处理,对于输出的使用to_char处理
三、传TO_DATE字符串进存储过程


注意看这里的mm,mi。

需要用to_date,将字符转换成日期:
 
to_date('2013-02-18 21:57:00','yyyy-mm-dd hh24:mi:ss')
 
比如:
insert into table(col1,datecol) values(1,to_date('2013-02-18 21:57:00','yyyy-mm-dd hh24:mi:ss'))
一般插入数据库时,用上面这种方式。因为oracle不区分大小写,不用上面写方的话,会出现“格式出现两次的错误”
//package dao.impl;
//import java.sql.ResultSet;
//import java.sql.SQLException;
//import java.util.ArrayList;
//import java.util.Date;
//import java.util.List;
//import dao.RegDao;
//import entity.Emp;
//
//public class RegDaoImpl  extends BaseDao implements RegDao {
//
//@Override
//public boolean add(Emp date) {
//String sql = "insert into emp(userName,regDate)values(?,to_date(?,'yyyy-mm-dd hh24:mi:ss'))";  //这里如果是:to_date(?,'yyyy-mm-dd hh24:mm:ss'会是什么结果?
//
//int i = 0;
//Object[] params = {date.getUserName(),date.getRegDate()};
//i = this.Update(sql, params);
//
//return false;
//}
//
//
//@Override
//public List<Emp> getEmpsList() {
//String sql = "select UserName,RegDate from emp";
//Object[] params ={};
//List<Emp> empList = new ArrayList<Emp>();
//ResultSet rs = this.Query(sql, params);
//try {
//while (rs.next()) {
//Emp emp = new Emp();
//emp.setUserName(rs.getString("UserName"));
//emp.setRegDate(rs.getString("RegDate"));
//
//; empList.add(emp);
//}
//} catch (SQLException e) {
//
//e.printStackTrace();
//}
//
//return empList;
//}
//public static void main(String[] args) {
//RegDaoImpl daoImpl = new RegDaoImpl();
//
//Date date = new Date();
//
//Emp emp = new Emp();
//emp.setUserName("李四");
//emp.setRegDate(date.toLocaleString());
//daoImpl.add(emp);
//List<Emp> List = daoImpl.getEmpsList();
//for (Emp emp2 : List) {
//System.out.println(emp2.getUserName()+"\t" + emp2.getRegDate());
//}
//}
//}


package dao.impl;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import dao.RegDao;
import entity.Emp;

public class RegDaoImpl  extends BaseDao implements RegDao {

	@Override
	public boolean add(Emp date) {
		String sql = "insert into emp(userName,regDate)values(?,to_date(?,'yyyy-MM-dd hh-mi-ss'))";//注意看一下这里①
		int i = 0;
		Object[] params = {date.getUserName(),date.getRegDate()};
		i = this.Update(sql, params);
		
		return false;
	}

	@Override
	public List<Emp> getEmpsList() {
		String sql = "select UserName,RegDate from emp";
		Object[] params ={};
		List<Emp> empList = new ArrayList<Emp>();
		ResultSet rs = this.Query(sql, params);
		try {
			while (rs.next()) {
				Emp emp = new Emp();
				emp.setUserName(rs.getString("UserName"));
				emp.setRegDate(rs.getString("RegDate"));
			
;				empList.add(emp);
			}
		} catch (SQLException e) {
			
			e.printStackTrace();
		}
		
		return empList;
	}
public static void main(String[] args) {
	RegDaoImpl daoImpl = new RegDaoImpl();
	
	Date date = new Date();
	
	Emp emp = new Emp();
	emp.setUserName("wtg");
	
	SimpleDateFormat fomat = new SimpleDateFormat("yyyy-MM-dd hh-mi-ss"); //注意看这里②
	emp.setRegDate(fomat.format(date));
	daoImpl.add(emp);
	List<Emp> List = daoImpl.getEmpsList();
	for (Emp emp2 : List) {
		System.out.println(emp2.getUserName()+"\t" + emp2.getRegDate());
	}
}
}

不过这里它却报出了一个java.lang.IllegalArgumentException: Illegal pattern character 'i'的异常,难道是它不认mi这个吗?它改mm却也还是报格式代码出现两次的异常。看来这也就是为何java API那里推荐使用Calendar类的原因了哦。
 
 
 
 
这里产生的两个结果不一样的。
select   to_char(regDate, 'yyyy/mm/dd  hh:mi:ss')  from emp;
select   to_char(regDate, 'yyyy/mm/dd  hh:mm:ss')  from emp;
,用这个列子来看就明白了
select   to_char(sysdate, 'yyyy/mm/dd hh:mi:ss')  from dual;
select   to_char(sysdate, 'yyyy/mm/dd hh:mm:ss')  from dual;
得到的结果是:
使用select   to_char(sysdate, 'yyyy/mm/dd hh:mi:ss')  from dual;的结果是
TO_CHAR(SYSDATE,'YYYY/MM/DDHH:MI:SS')
-------------------------------------
2014/07/12 11:27:52                   


使用select   to_char(sysdate, 'yyyy/mm/dd hh:mm:ss')  from dual;的结果是
TO_CHAR(SYSDATE,'YYYY/MM/DDHH:MM:SS')
-------------------------------------
2014/07/12 11:07:56  
可以看到,这里两个MM的值是月份
区别看这里的博客
http://blog.csdn.net/linlinv3/article/details/9815273
中的
2.日期到字符操作 
select  sysdate,to_char(sysdate,'yyyy-mm-dd hh24:mi:ss')  from dual
select  sysdate,to_char(sysdate,'yyyy-mm-dd hh:mi:ss')  from dual
select  sysdate,to_char(sysdate,'yyyy-ddd hh:mi:ss')  from dual
select  sysdate,to_char(sysdate,'yyyy-mm iw-d hh:mi:ss')  from dual

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值