JDBC操作MySQL5日期类型字段的问题解决方法由于日期数据的特殊性和多样性,以及不同的数据库、编程语言对日期的定义和处理方式差别,导致了日期处理的复杂性,和多样性。
列类型
|
“零”值
|
DATETIME
|
’0000-00-00 00:00:00′
|
DATE
|
’0000-00-00′
|
TIMESTAMP
|
00000000000000
|
TIME
|
’00:00:00′
|
YEAR
|
0000
|
当你只需要日期值而不需要时间部分时应使用DATE类型。MySQL用’YYYY-MM-DD’格式检索和显示DATE值。
TIMESTAMP列类型的属性不固定,取决于MySQL版本和服务器运行的SQL模式。
TIMESTAMP列的显示格式与DATETIME列相同。换句话说,显示宽度固定在19字符,并且格式为YYYY-MM-DD HH:MM:SS。
在一定程度上,可以将一个日期类型的值分配给一个不同的日期类型。但是,值可能会更改或丢失一些信息:
· 如果你为一个DATETIME或TIMESTAMP对象分配一个DATE值,结果值的时间部分被设置为’00:00:00′,因为DATE值未包含时间信息。
· 如果你为一个DATE对象分配一个DATETIME或TIMESTAMP值,结果值的时间部分被删除,因为DATE值未包含时间信息。
· 记住尽管可以使用相同的格式指定DATETIME、DATE和TIMESTAMP值,不同类型的值的范围却不同。例如,TIMESTAMP值不能早于1970或晚于2037。这说明一个日期,例如’1968-01-01′,虽然对于DATETIME或DATE值是有效的,但对于TIMESTAMP值却无效,如果分配给这样一个对象将被转换为0。
当指定日期值时请注意某些缺陷:
· 指定为字符串的值允许的非严格格式可能会欺骗。例如,值’10:11:12′由于‘:’间割符看上去可能象时间值,但如果用于日期上下文值则被解释为年’2010-11-12′。值’10:45:15′被转换为’0000-00-00′因为’45′不是合法月。
· 在非严格模式,MySQL服务器只对日期的合法性进行基本检查:年、月和日的范围分别是1000到9999、00到12和00到31。任何包含超出这些范围的部分的日期被转换成’0000-00-00′。请注意仍然允许你保存非法日期,例如’2002-04-31′。要想确保不使用严格模式时日期有效,应检查应用程序。
use testdb;
drop table if exists testdate;
create table testdate (
id bigint(20) not null auto_increment,
code varchar(20) default null,
crdate timestamp not null default current_timestamp,
primary key (id)
) engine=myisam auto_increment=122 default charset=latin1;
//对于插入,静态SQL,字符串型的日期格式是正确的
String sql_1 = “insert into testdate(code,crdate) values (‘x’,CURRENT_TIMESTAMP)”;
String sql_2 = “insert into testdate(code,crdate) values (‘y’,’2009-11-09 13:00:23′)”;
//对于插入,预定义SQL,java.sql.Timestamp型的日期格式参数是正确的
String sql = “insert into testdate(code,crdate) values (‘z’,?)”;
PreparedStatement pstmt = conn.prepareStatement(sql);
pstmt.setTimestamp(1, new Timestamp(System.currentTimeMillis()));
//对于插入,预定义SQL,java.lang.String型的日期格式参数是正确的
String sql = “insert into testdate(code,crdate) values (‘w’,?)”;
PreparedStatement pstmt = conn.prepareStatement(sql);
pstmt.setString(1, “2009-11-09 13:00:23″);
———-更新———————————–
//对于更新,静态SQL,字符串型的日期格式是正确的
String sql = “update testdate set crdate = ’2009-12-12 13:33:15′ where code = ‘z’”;
//对于更新,预定义SQL,java.lang.String型的日期格式参数是正确的
String sql = “update testdate set crdate = ? where code = ‘z’”;
PreparedStatement pstmt = conn.prepareStatement(sql);
pstmt.setString(1, “2009-12-12 13:33:15″);
———-查询———————————–
//对于查询,静态SQL(两种写法),java.lang.String型的日期格式参数是正确的
String sql = “select * from testdate where crdate > ’2009-11-09 13:00:23′ and crdate < ’2009-11-10 13:00:23′”;
String sql = “select * from testdate where date_format(crdate, ‘%Y-%c-%e %T’) between ’1900-2-1 00:00:00′ and ’2010-2-5 00:00:00′”;
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery(sql);
while (rs.next()) {
System.out.println(“>>> id=” + rs.getLong(“id”) + “; code=” + rs.getString(“code”) + “; crdate=” + rs.getTimestamp(“crdate”));
}
//但对于查询,预定义SQL,java的字符串和Timestamp类型参数都是错误的,不能执行,会提示语法错误。
//但别的数据库就另当别论了。
pstmt.setString(1,“2009-11-09 13:00:23″);
pstmt.setString(2,“2009-11-10 13:00:23″);
pstmt.setTimestamp(1,new Timestamp(sf.parse(“2009-11-09 13:00:23″).getTime()));
pstmt.setTimestamp(2,new Timestamp(sf.parse(“2009-11-10 13:00:23″).getTime()));
//对于插入,静态SQL,字符串型的日期格式是正确的
String sql_1 = “insert into testdate(code,crdate) values (‘x’,CURRENT_TIMESTAMP)”;
String sql_2 = “insert into testdate(code,crdate) values (‘y’,’2009-11-09 13:00:23′)”;
//对于插入,预定义SQL,java.sql.Timestamp型的日期格式参数是正确的
String sql = “insert into testdate(code,crdate) values (‘z’,?)”;
PreparedStatement pstmt = conn.prepareStatement(sql);
pstmt.setTimestamp(1, new Timestamp(System.currentTimeMillis()));
//对于插入,预定义SQL,java.lang.String型的日期格式参数是正确的
String sql = “insert into testdate(code,crdate) values (‘w’,?)”;
PreparedStatement pstmt = conn.prepareStatement(sql);
pstmt.setString(1, “2009-11-09 13:00:23″);
———-更新———————————–
//对于更新,静态SQL,字符串型的日期格式是正确的
String sql = “update testdate set crdate = ’2009-12-12 13:33:15′ where code = ‘z’”;
———-查询———————————–
//对于查询,静态SQL(两种写法),java.lang.String型的日期格式参数是正确的
String sql = “select * from testdate where crdate > ’2009-11-09 13:00:23′ and crdate < ’2009-11-10 13:00:23′”;
String sql = “select * from testdate where date_format(crdate, ‘%Y-%c-%e %T’) between ’1900-2-1 00:00:00′ and ’2010-2-5 00:00:00′”;
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery(sql);
while (rs.next()) {
System.out.println(“>>> id=” + rs.getLong(“id”) + “; code=” + rs.getString(“code”) + “; crdate=” + rs.getTimestamp(“crdate”));
}
本文出自 “熔 岩” 博客,请务必保留此出处http://lavasoft.blog.51cto.com/62575/224370