MySQL日期类型的处理总结
一、概述
MySQL中的日期類型包括以下5種:
| DATE | 3 | 1000-01-01/9999-12-31 | YYYY-MM-DD | 日期值 |
| TIME | 3 | '-838:59:59'/'838:59:59' | HH:MM:SS | 時間值或持續時間 |
| YEAR | 1 | 1901/2155 | YYYY | 年份值 |
| DATETIME | 8 | 1000-01-01 00:00:00/9999-12-31 23:59:59 | YYYY-MM-DD HH:MM:SS | 混合日期和時間值 |
| TIMESTAMP | 4 | 1970-01-01 00:00:00/2038 結束時間是第?2147483647?秒,北京時間?2038-1-19 11:14:07,格林尼治時間 2038年1月19日 凌晨 03:14:07 | YYYY-MM-DD HH:MM:SS | 混合日期和時間值,時間戳 |
二、DATE
從取值范圍來看DATE類型的mysql數據并不受格林尼治時間的限制。
1、使用場景
可以看到DATE類型的數據格式為:YYYY-MM-DD,對于只限制到日期的數據項,我們可以使用此種類型存儲,如生日、節假日等。
2、Java存儲方式
Java中對于date類型的存儲可以使用java.sql.date直接存入。
public int test() {String sql = "INSERT INTO user2(user_name,birthday) VALUES(?,?)";Object[] args = { "mht",java.sql.Date.valueOf("1992-11-20") };return jdbc.update(sql,args);}執行結果:
這是使用指定日期格式的字符串插入date類型數據的情況,對于那些并不是日期字符串的日期、毫秒值等,可以先通過DateFormat抽象類將其轉化為“yyyy-MM-dd”后再傳入靜態方法Date.valueOf(String dateStr)來實現。
3.Java查詢方式
DATE類型的mysql數據查詢到Java程序中,我們如何接收和處理。
首先,定義接收的實體類:
執行查詢:
public User test() {String sql = "select * from user2";List<User> list = jdbc.query(sql, new BeanPropertyRowMapper<>(User.class));User user = list.get(0);return user;}查詢結果:
說明:這里使用了一個靜態內部類來接收從數據庫中查詢的user對象,但是這和普通的實體類并沒有什么兩樣。此處沒有截取get、set方法,但是對于使用框架來查詢mapper的情況,get、set應該是必須的。
這里可能會有疑問,從數據庫中使用的date類型,在Java中可以用util.Date來接收嗎?
答案是可以的,當然也可以使用sql.Date,這并不會影響最終我們取得的數據,因為:
public class Date extends java.util.Date {如果我們將date類型(無論是sqlDate還是utilDate)直接返回給頁面,那么他們拿到的都是一個毫秒值(時分秒部分全為0),所以無論如何都需要在頁面通過js來實現日期的格式化,當然這不在我們的討論范疇之內。
總之,在Java中接收DATE日期,直接使用java.util.Date即可,也方便我們做其他轉化工作。
三、TIME
MySQL中的TIME時間類型,可以用于存儲時長或時間點。
1、Java存儲
public int test() {String sql = "INSERT INTO user2(user_name,time_on_foot) VALUES(?,?)";Object[] args = { "mht",java.sql.Time.valueOf("0:5:30") };return jdbc.update(sql, args);}存儲結果:
2、Java查詢
實體類:
對于TIME類型的mysql數據,Java中有對應的java.sql.Time來接收其值,而且,返回頁面的數據也會正常顯示數據庫中存儲的樣子而不會“變形”。
public User test() {String sql = "select * from user2";List<User> list = jdbc.query(sql, new BeanPropertyRowMapper<>(User.class));User user = list.get(0);return user;}查詢結果:
但是用java.util.Date來接收TIME類型的MySQL數據就會出現問題,所以對于TIME類型的數據,貌似只能用java.sql.Time類來接收數據。在實際開發中注意體會和總結。
四、DATETIME和TIMESTAMP
終于到了重頭戲部分!
DATETIME代表的語言含義是“日期時間”;而TIMESTAMP則表示“(人能看懂的)時間戳”。
兩種類型數據的格式都是“YYYY-MM-DD HH:MM:SS”。那在實際應用中我們的數據到底應該使用前者還是后者呢?
1、兩者的區別
a)、兩者的范圍不同。
b)、兩者的存儲大小不同。TIMESTAMP存儲空間是DATETIME的一半!
c)、雖然管理工具中并未顯示,但實際上TIMESTAMP可以精確到毫秒。
d)、TIMESTAMP有個特性:在insert、update數據時,TIMESTAMP列可以自動以當前時間(CURRENT_TIMESTAMP)填充/更新,MySQL引擎可以自動為更新的數據維護這個值。我們可以通過勾選“根據當前時間更新”復選框來調整MySQL數據庫對該字段的維護操作。如果有多個TIMESTAMP列,并且都勾選了此項,那么MySQL會對這些列都進行維護操作。
e)、TIMESTAMP會受到時區timezone的影響以及MySQL和SQL mode的影響。
2、TIMESTAMP設置默認值的方式
sql方式:
ALTER TABLE user2 MODIFY upd_time TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP管理工具方式:
新增記錄:
INSERT INTO user2(user_name) VALUES("MHT")結果展示:
2.Java存儲
先看一下db結構:
對于TIMESTAMP類型的數據,如果設置了默認值,且更新時數據庫會自動維護,那么在Java 中就不需要對其進行處理。如果需要Java進行插入,我們也可以通過如下方式來添加時間戳數據:
public int test() {String sql = "INSERT INTO user2(user_name,upd_time2) VALUES(?,?)";Object[] args = { "test1", new java.sql.Timestamp(System.currentTimeMillis())};return jdbc.update(sql,args);}我們通過java.sql.Timestamp對象來存儲不需要MySQL為我們維護的TIMESTAMP數據即可。
還以上表說話。
對于DATETIME類型的數據,create_time。實際上我們可以將這個字段設計為一個不會隨系統時間改變的TIMESTAMP。即只有insert的時候添加默認值,update時不會更新此值。
如果確定是要用datetime來表示該字段,那么,我們需要在Java中通過java.util.Date來存儲該值。因為java.util.Dated 默認包含時分秒數據,可以完美對應MySQL中DATETIME類型的數據。
String sql = "UPDATE user2 SET create_time = ? WHERE user_name = 'test1'";Object[] args = {new java.util.Date(System.currentTimeMillis())};jdbc.update(sql,args);執行結果為:
3、Java查詢
表中存在三個字段create_time、upd_time、upd_time2,第一個是DATETIME類型,后面兩個是TIMESTAMP類型數據。
我們的User對象定義三個字段的類型如下:
執行查詢:
public User test() {String sql = "select * from user2";List<User> list = jdbc.query(sql, new BeanPropertyRowMapper<>(User.class));User user = list.get(0);return user;}輸出結果:
可以看到MySQL中TIMESTAMP類型的數據無論用java.sql.Timestamp還是java.util.Date接收傳到頁面都是一個只精確到秒的毫秒值的形式。所以這兩種方式并沒有太大的區別。
DATETIME數據由于Java中只有java.util.Date可對應其類型,因此我們用其接收數據,也完全沒問題。為了方便記憶,我們可以在查詢DATETIME和TIMESTAMP兩種類型數據的時候都通過java.util.Date來接收即可。
五、常用的MySQL日期函數
SELECT NOW(),CURRENT_DATE(),CURRENT_TIME(),CURRENT_TIMESTAMP(),LOCALTIMESTAMP(),LOCALTIME()輸出結果:
-----------------------------------------------------我是分割線--------------------------------------------------------
綜上,就是對MySQL日期類型的處理總結,如有疑問,歡迎文末留言。
參考文章:《MySQL日期數據類型、時間類型使用總結》
總結
以上是生活随笔為你收集整理的MySQL日期类型的处理总结的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 英雄联盟与人生奋斗的类比讨论
- 下一篇: c语言程序设计的几种循环,C语言程序设计