舉個例子給你吧,mysql的 datetime字段
有表:
CREATE TABLE `u_user` (
`id` bigint(20) NOT NULL AUTO_INCREMENT,
`nickname` varchar(32) DEFAULT NULL,
`addtime` datetime?DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
插入的話
INSERT INTO u_user (nickname,ADDTIME) VALUES('小明','2017-09-29 08:59:59');
INSERT INTO u_user (nickname,ADDTIME) VALUES('小軍','20170930');
這樣寫都可以 的插入。
可以查到資料:
MySQL 以:
‘YYYY-MM-DD HH:MM:SS’
格式檢索與顯示 DATETIME?類型。支持的范圍是:
‘1000-01-01 00:00:00’
到
‘9999-12-31 23:59:59’。
MySQL(版本:5.1.50)的時間日期類型如下:
datetime 8bytes xxxx-xx-xx xx:xx:xx 1000-01-01 00:00:00到9999-12-31 23:59:59 timestamp 4bytes xxxx-xx-xx xx:xx:xx 1970-01-01 00:00:01到2038 date 3bytes xxxx-xx-xx 1000-01-01到9999-12-31 year 1bytes xxxx 1901到2155 time 3bytes xx:xx:xx -838:59:59到838:59:59(為了滿足時間的加減運算)
Java(1.6) 中能保存時間日期類型的類主要有
java.util.Date
java.util.Calendar
java.sql.Date
java.sql.Time
java.sql.Timestam
以前從mysql中查詢出來的時間日期類型,都放在java.util.Date類型里面了。這樣帶來一系列的問題,首先這個類提供的時間操作函數太少,一般都需要轉換成java.util.Calendar再去操作;其次即使使用了java.util.Calendar,也不是很方便,一個很簡單的想法,需要寫很多代碼才能實現;java.util.Date的數據內容為xxxx-xx-xx xx:xx:xx,有時候不需要時間,只需要日期。從數據庫中取值出來的日期類型放到這個類中的時候,會在時間位自動補上當前時間。這使得本來兩個日期在數據庫中是相等的,取出來放到這個類得時候就不再相等了,需要去考慮時間上的誤差,很是頭疼。
java提供與mysql方便交互的三種數據類型
java.sql.Date
java.sql.Time
java.sql.Timestam
它們都是繼承java.util.Date,算是對該類的精簡,很適合跟數據庫交互。
===========java注入數據庫==========
java類型 ? mysql類型 ? ? ? ?成功與否 date ? ? ? ? date ? ? ? ? ? ? ? yes date ? ? ? ? time ? ? ? ? ? ? ? no date ? ? ? ? timestamp ? ? ? no date ? ? ? ? datetime ? ? ? ? no time ? ? ? ? date ? ? ? ? ? ? ? no time ? ? ? ? time ? ? ? ? ? ? ? yes time ? ? ? ? timestamp ? ? ? no time ? ? ? ? datetime ? ? ? ? no timestamp date ? ? ? ? ? ? ?yes timestamp time ? ? ? ? ? ? ?yes timestamp timestamp ? ? yes timestamp datetime ? ? ? ?yes ==========end java注入數據庫======== 總規律,如果A完全包含B,則A可以向B注入數據,否則報錯
==========從數據庫提取到java ==========
mysql類型 ? ?java類型 ? ? 成與否 date ? ? ? ? ? ? date ? ? ? ? yes date ? ? ? ? ? ? time ? ? ? ? yes --------------缺少的部分使用歷元 date ? ? ? ? ? timestamp ? yes --------------缺少的部分使用歷元 ? time ? ? ? ? ? date ? ? ? ? ? yes --------------缺少的部分使用歷元 time ? ? ? ? ? time ? ? ? ? ? yes time ? ? ? ? ?timestamp ? ?yes --------------缺少的部分使用歷元 timestamp date ? ? ? ? ? yes timestamp time ? ? ? ? ? yes timestamp timestamp ? yes datetime ? ? ?date ? ? ? ? yes datetime ? ? ?time ? ? ? ? yes datetime ? ?timestamp ? yes ==========end 從數據庫提取到java======= 不會出錯,缺少的部分使用歷元,而不是當前日期時間
ull to db(null) =====> 也是null ? null to db(not null)=======> 數據庫報錯 db(null) to java==========> 如果單字段出來,則整個entity都是null,如果帶著其他不是null的字段出來,則可以實例化entity,本身字段依然是null db(not null) to java==========> 如果包含日期,則報錯,否則為000 最優解決方案,定義成可以為null java.sql時間系統的運算系列 after,before compareTo原小于參數返回<0,等于返回=0,大于返回>0 優點:于數據庫同類型,可以方便傳輸(無論是從DB到src還是反方向),方便比較大小 缺點:缺少運算單元,不適合時間跳躍的運算和間隔的運算 總結:calendar具有強大的跳躍運算和間隔運算能力,在需要的時候,可以將sql系列的時間轉成calendar。 先設置calendar為歷元,然后從sql系列時間中轉換,最后再轉回sql系列時間。 calendar只用于時間有跳躍的轉換,對比運算統一使用sql系統,這樣代碼將更清晰
date 和 calendar怎么初始化為格林威治時間 new date(0) calendar.setTimeInMillis(0) sql系列時間 static valueOf new XX(0)獲得歷元 new XX(year+1900, month+1,day,hour,minute,second,nano)已過時,創建也沒錯 toString或者SimpleDateFormat