MySQL5日期型別DATETIME和TIMESTAMP相關問題詳解
 
MySQL5的日期型別有三種:DATETIME、DATE和TIMESTAMP,除了DATE用來表示一個不帶時分秒的是日期,另外兩個都帶時分秒。TIMESTAMP還可以精確到毫秒。
 
其次還有個共性,就是他們的格式“不嚴格”,很自由,一般你認為對的格式都可以正確插入到資料庫中。
 
這裡主要解決帶時分秒日期的一些常見問題。
 
一、IMESTAMP
 
1、TIMESTAMP列必須有預設值,預設值可以為“0000-00-00 00:00:00”,但不能為null。
2、TIMESTAMP列不可以設定值,只能由資料庫自動去修改。
3、一個表可以存在多個TIMESTAMP列,但只有一個列會根據資料更新而改變為資料庫系統當前值。因此,一個表中有多個TIMESTAMP列是沒有意義,實際上一個表只設定一個TIMESTAMP列。
4、TIMESTAMP列的預設值是CURRENT_TIMESTAMP常量值。當紀錄資料發生變化的時候,TIMESTAMP列會自動將其值設定為CURRENT_TIMESTAMP。
5、TIMESTAMP列建立後的格式是:
`a` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
這個語句含義,a欄位的預設值是CURRENT_TIMESTAMP,當紀錄更新時候,自動將a欄位的值設定為CURRENT_TIMESTAMP。
6、另外,下面的定義從語法角度是對的,但是沒有意義,因為該欄位的值不可更改,永遠只能為預設值。
`b` timestamp NOT NULL DEFAULT `0000-00-00 00:00:00`,
 
 
二、DATETIME
 
1、DATETIME列可以設定為多個,預設可為null,可以手動設定其值。
2、DATETIME列不可設定預設值,這是很多人煞費苦心研究的成果,呵呵!
3、DATETIME列可以變相的設定預設值,比如通過觸發器、或者在插入資料時候,將DATETIME欄位值設定為now(),這樣可以做到了,尤其是後者,在程式開發中常常用到。
 
一般建表時候,建立時間用datetime,更新時間用timestamp。
CREATE TABLE user (
    id bigint(20) NOT NULL AUTO_INCREMENT,
    name varchar(20) CHARACTER SET gbk NOT NULL,
    sex tinyint(1) DEFAULT `1`,
    state smallint(2) DEFAULT `1`,
    createtime datetime NOT NULL,
    updatetime timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    PRIMARY KEY (id)
) ENGINE=MyISAM AUTO_INCREMENT=1 DEFAULT CHARSET=latin1
 
三、日期最大值範圍的問題
 
日期最大範圍的問題不是絕對的,很多人制定一個說不能查過20XX年,這是扯蛋,根本沒這回事。日期的範圍等問題與MySQL的執行模式有關。當然這個範圍很寬廣,足夠祖宗十八代用了,不用擔心這問題了。
 
相反,要注意的問題是,程式語言對日期範圍的限制,不同的語言,有不同的限制,這裡不做討論了。
 
四、日期格式轉換
 
1、字串轉日期
select STR_TO_DATE(`2010-03-03 16:41:16`, `%Y-%m-%d %H:%i:%s`)
 
2、日期轉字串
select DATE_FORMAT(`2010-03-03 16:41:16`, `%Y-%m-%d %H:%i:%s`)
 
五、日期的中年月日時分秒星期月份等獲取方法
 
select TIMESTAMP(`2010-03-03 16:41:16`);

select DATE(`2010-03-03 16:41:16`);

select YEAR(`2010-03-03 16:41:16`);

select MONTH(`2010-03-03 16:41:16`);

select DAY(`2010-03-03 16:41:16`);

select TIME(`2010-03-03 16:41:16`);

select CURTIME();

select CURDATE();

select CURRENT_DATE;

select CURRENT_TIME;

select CURRENT_TIMESTAMP;

 
方式很多,這裡簡單列舉一二。
 
六、日期的算術運算
 
相關的函式很多很多,用法也很簡單,一看就會,建議檢視MySQL參考手冊。
mysql> SELECT DATE_ADD(`1999-01-01`, INTERVAL 1 DAY);

                -> `1999-01-02`

mysql> SELECT DATE_ADD(`1999-01-01`, INTERVAL 1 HOUR);

                -> `1999-01-01 01:00:00`

mysql> SELECT DATE_ADD(`1998-01-30`, INTERVAL 1 MONTH);

                -> `1998-02-28`

 
七、日期的大小比較
 
拿著日當數字,拿著字串當日期,呵呵,很簡單的。
     and update_time > `2010-03-02 16:48:41`
     and update_time <= `2010-03-03 16:51:58`
 
搞明白這些,參考MySQL指南,日期問題輕鬆搞定。