摘要:日期和時間函數對建立一個站點是非常有用的。站點的主人往往對一個表中的數據何時被更新感興趣。通過日期和時間函數,你可以在秒級跟蹤一個表的改變。
日期和時間函數對建立一個站點是非常有用的。站點的主人往往對一個表中的數據何時被更新感興趣。通過日期和時間函數,你可以在秒級跟蹤一個表的改變。
日期和時間類型是DATETIME、DATE、TIMESTAMP、TIME和YEAR。這些的每一個都有合法值的一個范圍,而“零”當你指定確實不合法的值時被使用。注意,MySQL允許你存儲某個“不嚴格地”合法的日期值,例如1999-11-31,原因我們認為它是應用程序的責任來處理日期檢查,而不是SQL服務器。為了使日期檢查更“快”,MySQL僅檢查月份在0-12的范圍,天在0-31的范圍。上述范圍這樣被定義是因為MySQL允許你在一個DATE或DATETIME列中存儲日期,這裡的天或月是零。這對存儲你不知道准確的日期的一個生日的應用程序來說是極其有用的,在這種情況下,你簡單地存儲日期象1999-00-00或1999-01-00。(當然你不能期望從函數如DATE_SUB()或DATE_ADD()得到類似以這些日期的正確值)。
返回當前日期和時間
通過函數GETDATE(),你可以獲得當前的日期和時間。例如,
CURDATE() 返回當前日期
CURRENT_DATE
以YYYY-MM-DD或YYYYMMDD格式返回今天日期值,取決於函數是在一個字符串還是數字上下文被使用。
mysql> select CURDATE();
+------------+
| CURDATE() |
+------------+
| 2001-02-20 |
+------------+
mysql> select CURDATE() + 0;
+-------------+
| CURDATE()+0 |
+-------------+
| 20010220 |
+-------------+
CURTIME() 返回當前時間
以HH:MM:SS或HHMMSS格式返回當前時間值,取決於函數是在一個字符串還是在數字的上下文被使用。
mysql> select CURTIME();
+-----------+
| CURTIME() |
+-----------+
| 10:42:38 |
+-----------+
mysql> select CURTIME() + 0;
+-------------+
| CURTIME()+0 |
+-------------+
| 104525 |
+-------------+
NOW() 返回當前時期和時間
NOW()以YYYY-MM-DD HH:MM:SS的格式或者YYYYMMDDHHMMSS的格式返回日期和時間值,取決於上下文。
mysql>select now();
+---------------------+
| now() |
+---------------------+
| 2001-02-20 10:45:57 |
+---------------------+
mysql>select now()+0;
+----------------+
| now()+0 |
+----------------+
| 20010220105635 |
+----------------+
這些得到當前日期和時間的函數,對於日期和時間的計算很方便,尤其是計算一個時間到現在的時間差。例如,在pet表中,我們以天為單位計算寵物的年齡:
mysql> SELECT name,CURDATE()-birth FROM pet;
+----------+-----------------+
| name | CURDATE()-birth |
+----------+-----------------+
| Fluffy | 80016 |
| Claws | 69903 |
| Buffy | 119707 |
| Chirpy | 29309 |
| Fang | 109393 |
| Bowser | 109389 |
| Whistler | 39011 |
| Slim | 49791 |
| Puffball | 19890 |
+----------+-----------------+
自動記錄數據的改變時間
TIMESTAMP列類型提供一種類型,TIMESTAMP值可以從1970的某時的開始一直到2037年,精度為一秒,其值作為數字顯示。你可以使用它自動地用當前的日期和時間標記INSERT或UPDATE的操作。如果你有多個TIMESTAMP列,只有第一個自動更新。
自動更新第一個TIMESTAMP列在下列任何條件下發生:
列沒有明確地在一個INSERT或LOAD DATA INFILE語句中指定。
列沒有明確地在一個UPDATE語句中指定且一些另外的列改變值。(注意一個UPDATE設置一個列為它已經有的值,這將不引起TIMESTAMP列被更新,因為如果你設置一個列為它當前的值,MySQL為了效率而忽略更改。)
你明確地設定TIMESTAMP列為NULL.
除第一個以外的TIMESTAMP列也可以設置到當前的日期和時間,只要將列設為NULL,或NOW()。
例如,創建如下的表:
mysql> CREATE TABLE student
-> (
-> id int,
-> name char(16),
-> english tinyint,
-> chinese tinyint,
-> history tinyint,
-> time timestamp
-> );
向表中插入記錄,可以查看效果:
mysql> INSERT student(id,name,englisht,Chinese,history) VALUES(11,”Tom”,66,93,67);
查看記錄的存儲情況:
mysql> SELECT * FROM student;
+------+---------+---------+---------+---------+----------------+
| id | name | english | chinese | history | time |
+------+---------+---------+---------+---------+----------------+
| 11 | Tom | 66 | 93 | 67 | 20010220123335 |
+------+---------+---------+---------+---------+----------------+
你可以看到time列紀錄下了數據錄入時的時間值。如果你更新改記錄,在查看操作的結果:
mysql> UPDATE student SET english=76 WHERE id=11;
mysql> SELECT * FROM student;
+------+------+---------+---------+---------+----------------+
| id | name | english | chinese | history | time |
+------+------+---------+---------+---------+----------------+
| 11 | Tom | 76 | 93 | 67 | 20010220125736 |
+------+------+---------+---------+---------+----------------+
可以清楚的看到,time列的時間被自動更改為修改記錄的時間。
有時候你希望不更改任何值,也能打到修改TIMESTAMP列的值,這時只要設置該列的值為NULL,MySQL就可以自動更新TIMESTAMP列的值:
mysql> UPDATE student SET time=NULL WHERE id=11;
mysql> select * from student where id=11;
+------+------+---------+---------+---------+----------------+
| id | name | english | chinese | history | time |
+------+------+---------+---------+---------+----------------+
| 11 | Tom | 76 | 93 | 67 | 20010220130517 |
+------+------+---------+---------+---------+----------------+
通過明確地設置希望的值,你可以設置任何TIMESTAMP列為不同於當前日期和時間的值,即使對第一個TIMESTAMP列也是這樣。例如,如果,當你創建一個行時,你想要一個TIMESTAMP被設置到當前的日期和時間,但在以後無論何時行被更新時都不改變,你可以使用這樣使用:
讓MySQL在行被創建時設置列,這將初始化它為當前的日期和時間。
當你執行隨後的對該行中其他列的更改時,明確設定TIMESTAMP列為它的當前值。
例如,當你在修改列時,可以把原有的值付給TIMESTAMP列:
mysql> UPDATE student SET english=66,time=time WHERE id=11;
mysql> select * from student where id=11;
+------+------+---------+---------+---------+----------------+
| id | name | english | chinese | history | time |
+------+------+---------+---------+---------+----------------+
| 11 | Tom | 66 | &nb