在MySQL中提供了DATE、DATETIME、TIMESTAMP和TIME等数据类型用于存储与日期时间相关的值,但是如果查阅Java API可以发现java.sql.PreparedStatement中仅仅提供了setDate、setTime和setTimestamp等方法用于设置对应的值。方法的声明如下:
(1)void setDate(int parameterIndex, java.sql.Date x) throws SQLException
(2)void setTime(int parameterIndex, java.sql.Time x) throws SQLException
(3)void setTimestamp(int parameterIndex, java.sql.Timestamp x) throws SQLException
从方法的声明中可以看出,各个方法需要的参数类型为java.sql.Date、java.sql.Time和java.sql.Timestamp,而从继承关系可以看出:java.sql.Date、java.sql.Time和java.sql.Timestamp均继承自java.util.Date。JDBC中的时间、日期处理与常用的java.util.Date之间存在一定的阻抗。
在MySQL中,使用如下DDL建立数据库表:
CREATE TABLE `time_test` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`col_date` date DEFAULT NULL,
`col_time` time DEFAULT NULL,
`col_datetime` datetime DEFAULT NULL,
`col_timestamp` timestamp NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
对于col_date和col_time列的值,我们可以使用PreparedStatement中提供的setDate()和setTime()来设置其值,但是如果设置col_datetime和col_timestamp列的值呢?首先来对col_timestamp设置其值。幸运的是,PreparedStatement中提供了setTimestamp()方法来设置其值,但是对于col_datetime的值是否也可以通过使用setTimestamp()来设置呢?事实证明是可行的。JDBC中没有提供对MySQL中datetime类型的列直接设置其值的方法,而datetime和timestamp又同时能够存储日期时间类型的数据,那么我们是否可以简单地采用timestamp类型而不使用datetime呢,答案肯定是不行的。
MySQL的官方文档中对这几种数据类型进行了阐述,可以简单总结如下:
(1)DATETIME所支持的时间范围为'1000-01-01 00:00:00' 到 '9999-12-31 23:59:59'。MySQL会使用'YYYY-MM-DD HH:MM:SS'格式来显示DATETIME类型的值;
(2)TIMESTAMP所支持的时间范围为'1970-01-01 00:00:01' UTC到'2038-01-19 03:14:07' UTC。在MySQL中,TIMESTAMP类型的值存储为自'1970-01-01 00:00:00'UTC起的秒数,但是需要注意的是TIMESTAMP类型并不能表示'1970-01-01 00:00:00'。
那么,如何向DATETIME类型的列中存储值呢?一种可行的方式是采用PreparedStatement提供的setString()方法,并提供满足一定格式的日期时间字符串,例如:“2011-01-18 03:15:06”,具体请参考MySQL的官方文档:http://dev.mysql.com/doc/refman/5.0/en/datetime.html。
(1)void setDate(int parameterIndex, java.sql.Date x) throws SQLException
(2)void setTime(int parameterIndex, java.sql.Time x) throws SQLException
(3)void setTimestamp(int parameterIndex, java.sql.Timestamp x) throws SQLException
从方法的声明中可以看出,各个方法需要的参数类型为java.sql.Date、java.sql.Time和java.sql.Timestamp,而从继承关系可以看出:java.sql.Date、java.sql.Time和java.sql.Timestamp均继承自java.util.Date。JDBC中的时间、日期处理与常用的java.util.Date之间存在一定的阻抗。
在MySQL中,使用如下DDL建立数据库表:
CREATE TABLE `time_test` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`col_date` date DEFAULT NULL,
`col_time` time DEFAULT NULL,
`col_datetime` datetime DEFAULT NULL,
`col_timestamp` timestamp NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
对于col_date和col_time列的值,我们可以使用PreparedStatement中提供的setDate()和setTime()来设置其值,但是如果设置col_datetime和col_timestamp列的值呢?首先来对col_timestamp设置其值。幸运的是,PreparedStatement中提供了setTimestamp()方法来设置其值,但是对于col_datetime的值是否也可以通过使用setTimestamp()来设置呢?事实证明是可行的。JDBC中没有提供对MySQL中datetime类型的列直接设置其值的方法,而datetime和timestamp又同时能够存储日期时间类型的数据,那么我们是否可以简单地采用timestamp类型而不使用datetime呢,答案肯定是不行的。
MySQL的官方文档中对这几种数据类型进行了阐述,可以简单总结如下:
(1)DATETIME所支持的时间范围为'1000-01-01 00:00:00' 到 '9999-12-31 23:59:59'。MySQL会使用'YYYY-MM-DD HH:MM:SS'格式来显示DATETIME类型的值;
(2)TIMESTAMP所支持的时间范围为'1970-01-01 00:00:01' UTC到'2038-01-19 03:14:07' UTC。在MySQL中,TIMESTAMP类型的值存储为自'1970-01-01 00:00:00'UTC起的秒数,但是需要注意的是TIMESTAMP类型并不能表示'1970-01-01 00:00:00'。
那么,如何向DATETIME类型的列中存储值呢?一种可行的方式是采用PreparedStatement提供的setString()方法,并提供满足一定格式的日期时间字符串,例如:“2011-01-18 03:15:06”,具体请参考MySQL的官方文档:http://dev.mysql.com/doc/refman/5.0/en/datetime.html。