在本教程中,您將學(xué)習(xí)如何在SQL中使用日期和時間。
除了字符串和數(shù)字之外,您經(jīng)常需要在數(shù)據(jù)庫中存儲日期和/或時間值,例如用戶的出生日期、雇員的雇傭日期、未來事件的日期、在表中創(chuàng)建或修改特定行的日期和時間等等。
這種類型的數(shù)據(jù)稱為臨時數(shù)據(jù),每個數(shù)據(jù)庫引擎都有用于存儲它們的默認(rèn)存儲格式和數(shù)據(jù)類型。下表顯示了MySQL數(shù)據(jù)庫服務(wù)器支持的用于處理日期和時間的數(shù)據(jù)類型。
類型 | 預(yù)設(shè)格式 | 容許值 |
---|---|---|
DATE | YYYY-MM-DD | 1000-01-01 - |
TIME | HH:MM:SS or HHH:MM:SS | -838:59:59 - |
DATETIME | YYYY-MM-DD HH:MM:SS | 1000-01-01 00:00:00 - |
TIMESTAMP | YYYY-MM-DD HH:MM:SS | 1970-01-01 00:00:00 - |
YEAR | YYYY | 1901 - |
DATE值的格式為YYYY-MM-DD,其中YYYY表示全年(4位數(shù)字),而MM和DD分別表示日期的月和日部分(兩個前零的數(shù)字)。時間值通常采用HH:MM:SS格式,其中HH、MM、SS分別表示時間的小時、分鐘、秒部分。
以下語句演示了如何在數(shù)據(jù)庫表中插入日期值:
INSERT INTO employees (emp_name, hire_date, salary) VALUES ('Adam Smith', '2015-06-24', 4500);
注意:在MySQL中,小時部分的時間值可能更大,因?yàn)镸ySQL將它們視為運(yùn)行時間。這意味著時間數(shù)據(jù)類型不僅可以用于表示一天中的一個時間(必須小于24小時),還可以用于表示兩個事件之間的時間間隔,可能大于24小時,甚至為負(fù)值。
在使用大型應(yīng)用程序的數(shù)據(jù)庫時,通常需要在數(shù)據(jù)庫中存儲記錄創(chuàng)建時間或上次修改時間,例如,存儲用戶注冊時或用戶上次更新密碼時的日期和時間等。
在MySQL中,您可以使用NOW()函數(shù)插入當(dāng)前時間戳,如下所示:
-- MySQL數(shù)據(jù)庫的語法 INSERT INTO users (name, birth_date, created_at) VALUES ('Bilbo Baggins', '1998-04-16', NOW());
但是,如果您不想手動插入當(dāng)前日期和時間,則只需使用TIMESTAMP和DATETIME數(shù)據(jù)類型的自動初始化和自動更新屬性。
要分配自動屬性,請在列定義中指定DEFAULT CURRENT_TIMESTAMP和ON UPDATE CURRENT_TIMESTAMP子句,如下所示:
-- MySQL數(shù)據(jù)庫的語法 CREATE TABLE users ( id INT(4) NOT NULL PRIMARY KEY AUTO_INCREMENT, name VARCHAR(50) NOT NULL UNIQUE, birth_date DATE NOT NULL, created_at DATETIME DEFAULT CURRENT_TIMESTAMP, updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP );
注意:DATETIME數(shù)據(jù)類型的自動初始化和更新,僅在MySQL 5.6.5或更高版本中可用。如果您使用的是舊版本,請使用TIMESTAMP。
在某些情況下,您只想獲取日期或時間的一部分。 在MySQL中,您可以使用專門設(shè)計用于提取部分時間值的函數(shù),例如YEAR(),MONTH(),DAYOFMONTH(),MONTHNAME(),DAYNAME(),HOUR(),MINUTE(),SECOND()等。
以下SQL語句將提取birth_date列值的年份部分,例如 如果任何用戶的生日是1987-01-14,則YEAR(birth_date)將返回1987。
mysql> SELECT name, YEAR(birth_date) FROM users;
同樣,您可以使用DAYOFMONTH()函數(shù)獲取每月的某天,例如 如果任何用戶的birth_date是1986-10-06,則DAYOFMONTH(birth_date)將返回6。
mysql> SELECT name, DAYOFMONTH(birth_date) FROM users;
如果要在結(jié)果集中使用更具描述性和可讀性的日期格式,則可以使用DATE_FORMAT()和TIME_FORMAT()函數(shù)重新格式化現(xiàn)有的日期和時間值。
下面的SQL語句將以更易讀的格式設(shè)置users表中birth_date列的值的格式,例如1987年1月14日到1987年1月14日的值。
mysql> SELECT name, DATE_FORMAT(birth_date, '%M %e, %Y') FROM users;