18 SQL Date & Time
1. 定義
解釋:
Date
和Time
資料型別分別用於儲存日期
和時間
格式類資料。
2. 前言
本小節中,我們將學習 SQL 種常見的日期和時間
資料型別。
在很多真實業務中,我們需要儲存一些日期時間資料,比如:使用者生日
,新聞聯播播出時間
等等;若是採用字串儲存,在操作的時候會頗為麻煩,為了方便使用者,SQL 給我們提供了日期和時間資料型別和諸多好用的函式。
提示: 不同的 DBMS 對於日期和時間的支援差異很大,本小節會著重介紹幾種常用資料型別。
本小節測試資料如下,請先在資料庫中執行:
DROP TABLE IF EXISTS imooc_user;
CREATE TABLE imooc_user
(
username varchar(20),
age int,
lunchtime time,
birthday date
);
INSERT INTO imooc_user(username,age,lunchtime,birthday)
VALUES ('peter', 18, '12:00:00', '2002-10-21'), ('pedro', 24, '11:30:00', '1996-03-15');
3. SQL Time
SQL Time 用於儲存時間類資料型別,時間的範圍在-838:59:59.000000 ~ 838:59:59.000000
之間,當然有效值在00:00:00~23.59.59
之間。
3.1 例1 插入使用者
請書寫 SQL 語句,向imooc_user
中插入一個新使用者,使用者名稱為lucy
,lunchtime為00:00:00
。
分析:
由題幹可知,使用 Insert 指令向表中插入資料即可;由於在新建 imooc_user 表時已經指定 lunchtime 的資料型別為time
,在語句中寫入格式化後的時間字串,資料庫會自動識別並存儲。
語句:
INSERT INTO imooc_user(username,lunchtime) VALUES('lucy','00:00:00');
插入成功後,結果為:
+----------+--------+-----------+------------+ | username | age | lunchtime | birthday | +----------+--------+-----------+------------+ | lucy | <null> | 00:00:00 | <null> | +----------+--------+-----------+------------+
4. SQL Date
SQL Date 用於儲存日期類資料型別,日期的有效值範圍在1000-01-01 ~ 9999-12-31
之間。
4.1 例2 更新使用者
請書寫 SQL 語句,更新imooc_user
中的lucy
使用者,將其年齡設定為20
,生日設定為2000-01-08
。
分析:
題幹中明確指出更新使用者,使用 Update 指令,更新欄位為年齡和生日。
語句:
UPDATE imooc_user SET age=20,birthday='2000-01-08' WHERE username='lucy';
更新成功後,結果為:
+----------+-----+-----------+------------+
| username | age | lunchtime | birthday |
+----------+-----+-----------+------------+
| lucy | 20 | 00:00:00 | 2000-01-08 |
+----------+-----+-----------+------------+
5. SQL Timestamp
SQL Timestamp 用來儲存時間戳資料,不僅可以儲存日期資料,還可以儲存時間資料。
5.1 例3 修改使用者表
請書寫 SQL 語句,給imooc_user
表新增create_time
欄位,欄位型別為timestamp
,並更新lucy
使用者的create_time
欄位的值為當前時間戳。
分析:
需先使用 Alter 指令給 imooc_user 新增 create_time 欄位,欄位型別為 timestamp,然後使用 Update 指令,更新 lucy 使用者的 create_time 欄位為當前時間戳。
提示: SQL 中提供了
now
函式可以方便的生成當前時間戳。
語句:
ALTER TABLE imooc_user ADD create_time timestamp;
UPDATE imooc_user SET create_time=now() WHERE username='lucy';
更新成功後,結果為:
+----------+-----+-----------+------------+---------------------+
| username | age | lunchtime | birthday | create_time |
+----------+-----+-----------+------------+---------------------+
| lucy | 20 | 00:00:00 | 2000-01-08 | 2020-01-12 22:43:38 |
+----------+-----+-----------+------------+---------------------+
6. 其它
在 SQL 標準中關於時間和日期的資料型別主要有三類,即time
,date
和timestamp
。
不過在不同的資料庫中,相應的時間會有所不同,如 MySQL 中還支援 datetime 來融合 date 和 time;而在 SQL Server 中不支援 timestamp 資料型別,僅支援 datetime 型別;PostgreSQL 對日期型別支援最為複雜,甚至還支援日期範圍之類的日期格式。
7. 小結
- timestamp 會受到
時區
因素影響,請提前設定資料庫正確的配置資訊保證資料的正確性。 - datetime 和 timestamp 二者一定程度上可以通用,但是某些資料庫只支援其中的一種。
- time、date 和 timestamp 都可以像其它資料型別一樣使用運算子,如
>
。