MySql與Java的時間型別

瓜瓜東西發表於2015-01-05

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 anINSERT 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 TIMEcolumns using either strings or numbers.

 

Time只記錄時間資訊,不包含日期資訊。

範圍為-838:59:59 到 838:59:59, MySql 以HH:MM:SS格式化該資料,允許輸入為字串或者數字。

程式碼:
public void testTime() throws SQLException

       {

              IDBFace DBFace =DBFactory.createMySqlFace();

              DBFace.connect();

              //清空表

              String strDelete ="delete from time_table";

              DBFace.update(strDelete);

              //新增

             

              String strInsert ="insert into time_table(CreateTime) values(131211)";

              DBFace.update(strInsert);

              //獲取

              String strSelect ="select * from time_table";

              ResultSet rsBuffer =DBFace.select(strSelect);

              while(rsBuffer.next())

              {

                     Time tmBuffer =rsBuffer.getTime("CreateTime");

                     System.out.println(tmBuffer.toString());

              }

              DBFace.close();

       }

執行結果: 13:12:11

Year

A year in two-digit or four-digit format. The default is four-digit format. In four-digit format, the allowable values are 1901 to 2155, and0000. In two-digit format, the allowable values are 70 to 69, representing years from 1970 to 2069. MySQL displays YEAR values in YYYYformat, but allows you to assign values to YEAR columns using either strings or numbers. The YEAR type is unavailable prior to MySQL 3.22.

 

Year可以有2種表示方式,4位的和2位的。

預設情況是4位。其範圍為1901-2155

2位的表述法只記錄後2位 。其範圍為1970-2069

允許以字串或者數字的方式插入。

 

程式碼:
       public void testYear() throws SQLException

       {

              IDBFace DBFace =DBFactory.createMySqlFace();

              DBFace.connect();

              //清空表

              String strDelete ="delete from time_table";

              DBFace.update(strDelete);

              //新增

             

              String strInsert ="insert into time_table(CreateYear) values(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().

這只是一個想法,有沒有額外的問題尚未證明。/

相關文章