SQL 日期和時間

在本教程中,您將學(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è)格式容許值
DATEYYYY-MM-DD1000-01-01 - 9999-12-31
TIMEHH:MM:SS or HHH:MM:SS-838:59:59 - 838:59:59
DATETIMEYYYY-MM-DD HH:MM:SS1000-01-01 00:00:00 - 9999-12-31 23:59:59
TIMESTAMPYYYY-MM-DD HH:MM:SS1970-01-01 00:00:00 - 2037-12-31 23:59:59
YEARYYYY1901 - 2155

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ù)值。

跟蹤行創(chuàng)建或修改時間

在使用大型應(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;
丰满人妻一级特黄a大片,午夜无码免费福利一级,欧美亚洲精品在线,国产婷婷成人久久Av免费高清