首页 >php教程 >php手册 >解析MySql与Java的时间类型

解析MySql与Java的时间类型

WBOY
WBOY原创
2016-06-13 11:46:291025浏览

MySql的时间类型有          Java中与之对应的时间类型
date                                           java.sql.Date
Datetime                                    java.sql.Timestamp
Timestamp                                  java.sql.Timestamp
Time                                          java.sql.Time
Year                                           java.sql.Date

对其进行分析
参考MySql 的reference manual
Date:
A date. The supported range is '1000-01-01' to '9999-12-31'. MySQL displays DATE values in 'YYYY-MM-DD' format, but allows you to assign values to DATE columns using either strings or numbers.
只记录日期信息,表示范围为1000-01-01 至 9999-12-31。
MySql 按照YYYY-MM-DD 的方式进行该类字段的显示。添加该类字段数据,即可以使用字符串类型,也可以使用数字类型

由于Date类型的字段只记录日期信息,所以如果添加的数据中包含了时间信息,该时间信息将会自动被截断。
如果要保存时间信息,可以考虑使用DateTime类型。
经过测试,发现如下2种方式可以对Date类型字段进行填充:
按字符串:
insert into time_table(CreateDate) values(‘2007-04-09')
按数字:
insert into time_table(CreateDate) values(20070409)
获取可以用java.sql.Date类型获取
代码为:
Date dtDate =rsBuffer.getDate("CreateDate");
测试代码如下:(其中,IDBFace 是自己基于JDBC封装的一个简单类, 接受Sql对数据库进行操作)

复制代码 代码如下:


public void testDate()throws SQLException
{
       IDBFace DBFace =DBFactory.createMySqlFace();
       DBFace.connect();
       //清空表
       String strDelete ="delete from time_table";
       DBFace.update(strDelete);
       //添加

       String strInsert ="insert into time_table(CreateDate) values(20070409)";
       DBFace.update(strInsert);

             
       //获取
       String strSelect ="select * from time_table";
       ResultSet rsBuffer =DBFace.select(strSelect);
       while(rsBuffer.next())
       {
              Date dtDate =rsBuffer.getDate("CreateDate");
              System.out.println(dtDate.toString());
       }
       DBFace.close();
}


执行结果: 2007-04-09

DateTime
A date and time combination. The supported range is '1000-01-01 00:00:00' to '9999-12-31 23:59:59'. MySQL displays DATETIME values in 'YYYY-MM-DD HH:MM:SS' format, but allows you to assign values to DATETIME columns using either strings or numbers.
DateTime 与Date最主要的区别在于:DateTime 可以记录日期和时间信息。而Date只记录日期信息。表示范围为: 1000-01-01 00:00:00 至 9999-12-31 23:59:59 MySql的按照YYYY-MM-DD HH:MM:SS对数据进行格式化,允许以字符串和数字的方式提交。

例如以数字的方式进行提交:
insert into time_table(CreateDate) values(20070409132013)
获取该类型的数据可以使用:java.sql.Timestamp类型
代码如下:

复制代码 代码如下:


public void testDateTime() throws SQLException
{
       IDBFace DBFace =DBFactory.createMySqlFace();
DBFace.connect();
       //清空表
       String strDelete ="delete from time_table";
       DBFace.update(strDelete);
       //添加

       String strInsert ="insert into time_table(CreateDateTime) values(20070409132013)";
       DBFace.update(strInsert);
       //获取
       String strSelect ="select * from time_table";
       ResultSet rsBuffer =DBFace.select(strSelect);
       while(rsBuffer.next())
       {
              Timestamp tsBuffer =rsBuffer.getTimestamp("CreateDateTime");
              System.out.println(tsBuffer.toString());
       }
       DBFace.close();
}


执行结果: 2007-04-09 13:20:13.0
TimeStamp
A timestamp. The range is '1970-01-01 00:00:00' to partway through the year 2037. A TIMESTAMP column is useful for recording the date and time of an INSERT or UPDATE operation. The first TIMESTAMP column in a table is automatically set to the date and time of the most recent operation if you don't assign it a value yourself. You can also set any TIMESTAMP column to the current date and time by assigning it a NULL value.
与DateTime类型非常相似
范围为1970-01-01 –2037年,精度为1秒/
如果在Sql中未对Timestamp类型的列赋值,该列将被构造成当前时间。
提交NULL值也会使该列以当前时间录入。
如果时间提交错误,该列将被填入0.
Timestamp比DateTime 类型所需的存储空间更小,只需要4个字节,而DateTime需要8个字节。
但是有一点需要特别注意。Timestamp只能表示时间范围为1970 -2037.
使用Timestamp一定要确保提交的时间数据一定不会超过这个范围。
代码与DateTime类是,而且我不喜欢用,所以略掉了。
Time:
A time. The range is '-838:59:59' to '838:59:59'. MySQL displays TIME values in 'HH:MM:SS' format, but allows you to assign values to TIME columns using either strings or numbers.

Time只记录时间信息,不包含日期信息。
范围为-838:59:59 到 838:59:59, MySql 以HH:MM:SS格式化该数据,允许输入为字符串或者数字。
代码:

复制代码 代码如下:


public void testTime() 抛出 SQLException
       {
              IDBFace DBFace =DBFactory.createMySqlFace();
              DBFace.connect();
              //清空表
              String strDelete ="从 time_table 中删除";
              DBFace.update(strDelete);
              // 添加

              String strInsert ="插入 time_table(CreateTime) 值(131211)";
              DBFace。 update(strInsert);
              //获取
              String strSelect ="select * from time_table";
              ResultSet rsBuffer =DBFace.select(strSelect);
              while(rsBuffer.next ())
              {
                     时间 tmBuffer =rsBuffer.getTime("CreateTime");
                    System.out.println(tmBuffer.toString());
              }
              DBFace.close();
       }


执行结果: 13:12:11
年份
两位数或四位数字格式的年份。默认为四位数字格式。在四位数字格式中,允许的值为 1901 到 2155 和 0000。在两位数格式中,允许的值为 70 到 69,代表从 1970 到 2069 的年份。MySQL 以 YYYY 格式显示 YEAR 值,但允许您使用字符串或数字将值分配给 YEAR 列。 YEAR 类型在 MySQL 3.22 之前不可用。

年份可以有2种表示方式,4位的和2位的。
默认情况是4位。其范围为1901-2155
2位的梨法只记录后2位其范围为1970-2069
允许以字符串或者数字的方式插入。
代码:

复制代码代码如下:


       public void testYear() 抛出 SQLException
       {
              IDBFace DBFace =DBFactory.createMySqlFace();
             DBFace.connect();
              //清空表
              String strDelete ="从 time_table 中删除";
              DBFace.update(strDelete);
              // 添加

              String strInsert ="插入 time_table(CreateYear) 值(2007)";
              DBFace。 update(strInsert);
              //获取
              String strSelect ="select * from time_table";
              ResultSet rsBuffer =DBFace.select(strSelect);
              while(rsBuffer.next ())
              {
                     Date dtBuffer =rsBuffer.getDate("CreateYear");
                     System.out.println(dtBuffer.getYear() 1900);
              }
              DBFace.close();
}


执行结果:2007
需要说明的是:
Date.getYear()方法返回至1900年起经过了多少年。所以为了显示正确的时间,必须加1900年上。
该方法已经被荒废。

另外。
有一种方法是:不使用上述任何一种类型来记录时间。
则以char(或vchar)的方式来记录时间。
这样做在插入数据和显示记录的时候固然不用进行任何转换而比较方便。
但是要承受2个重要的缺陷。
( 1) 单独要合法开发方法时间数据的性。例如ajidjieoa字符串不是一个时间信息,但仍然可以正常插入。(2) 如果系统需要将时间范围做为条件进行记录检索。是一个*麻烦。用字符串记录时间将无法使用MySql为时间提供的API。对时间范围搜索的代码可能与数据库分割。这样对性能必然造成影响。例如,要从100万条数据中查询时间范围对于1992-3-12 –1992-3-13日的区区100条数据,你可能不得不将100万条数据都查出来,再开发新的方法进行过滤。

另外,MySql到4.1时间精确度若只到秒考虑。
要记录更细的时间粒度。可以构造DateTime。
记录DateTime.trick()。
这只是一个想法,没有其他的问题尚未证明。/

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn