MySQL深度知識五(摘自sql官方文檔)

SQL 日期
當我們處理日期時,最難的任務恐怕是確保所插入的日期的格式,與數據庫中日期列的格式相匹配。
只要數據包含的只是日期部分,運行查詢就不會出問題。但是,如果涉及時間,情況就有點復雜了。
在討論日期查詢的復雜性之前,我們先來看看最重要的內建日期處理函數。
MySQL Date 函數
下面的表格列出了 MySQL 中最重要的內建日期函數:
定義和用法   NOW() 函數返回當前的日期和時間。
語法   NOW()

例子 1
SELECT NOW(),CURDATE(),CURTIME()
NOW()        CURDATE()   CURTIME()
2008-12-29 16:25:46 2008-12-29   16:25:46
例子 2
下面的 SQL 創(chuàng)建帶有日期時間列 (OrderDate) 的 "Orders" 表:
CREATE TABLE Orders
(
OrderId int NOT NULL,
ProductName varchar(50) NOT NULL,
OrderDate datetime NOT NULL DEFAULT NOW(),
PRIMARY KEY (OrderId)
)

請注意,OrderDate 列規(guī)定 NOW() 作為默認值。作為結果,當您向表中插入行時,當前日期和時間自動插入列中。
現在,我們希望在 "Orders" 表中插入一條新記錄:
INSERT INTO Orders (ProductName) VALUES ('Computer')

CURDATE() 函數返回當前的日期。
語法 CURDATE()
CURTIME() 函數返回當前的時間。
語法 CURTIME()
DATE() 函數返回日期或日期/時間表達式的日期部分。
語法 DATE(date)
date 參數是合法的日期表達式。
假設我們有如下的表:
OrderId ProductName OrderDate
1 'Computer' 2008-12-29 16:25:46.635

SELECT ProductName, DATE(OrderDate) AS OrderDate
FROM Orders WHERE OrderId=1

ProductName OrderDate
'Computer' 2008-12-29

EXTRACT() 函數用于返回日期/時間的單獨部分,比如年、月、日、小時、分鐘等等。
EXTRACT(unit FROM date)
date 參數是合法的日期表達式。unit 參數可以是下列的值:
Unit 值
MICROSECOND
SECOND
MINUTE
HOUR
DAY
WEEK
MONTH
QUARTER
YEAR
SECOND_MICROSECOND
MINUTE_MICROSECOND
MINUTE_SECOND
HOUR_MICROSECOND
HOUR_SECOND
HOUR_MINUTE
DAY_MICROSECOND
DAY_SECOND
DAY_MINUTE
DAY_HOUR
YEAR_MONTH

假設我們有如下的表:
OrderId ProductName OrderDate
1 'Computer' 2008-12-29 16:25:46.635
使用下面的 SELECT 語句:
SELECT EXTRACT(YEAR FROM OrderDate) AS OrderYear,
EXTRACT(MONTH FROM OrderDate) AS OrderMonth,
EXTRACT(DAY FROM OrderDate) AS OrderDay
FROM Orders WHERE OrderId=1
結果:
OrderYear OrderMonth OrderDay
2008 12 29

DATE_ADD() 函數向日期添加指定的時間間隔。
DATE_ADD(date,INTERVAL expr type)
date 參數是合法的日期表達式。expr 參數是您希望添加的時間間隔。
我們希望向 "OrderDate" 添加 2 天,這樣就可以找到付款日期。
SELECT OrderId,DATE_ADD(OrderDate,INTERVAL 2 DAY)
AS OrderPayDate FROM Orders

DATE_SUB() 函數從日期減去指定的時間間隔。
DATE_SUB(date,INTERVAL expr type)
我們希望從 "OrderDate" 減去 2 天。
SELECT OrderId,DATE_SUB(OrderDate,INTERVAL 2 DAY)
AS OrderPayDate FROM Orders

DATEDIFF() 函數返回兩個日期之間的天數。
DATEDIFF(date1,date2)
date1date2 參數是合法的日期或日期/時間表達式。
注釋:只有值的日期部分參與計算。
例子 1  SELECT DATEDIFF('2008-12-30','2008-12-29') AS DiffDate

DiffDate
1
例子 2  SELECT DATEDIFF('2008-12-29','2008-12-30') AS DiffDate
DiffDate
-1

DATE_FORMAT() 函數用于以不同的格式顯示日期/時間數據
DATE_FORMAT(date,format)
date 參數是合法的日期。format 規(guī)定日期/時間的輸出格式。

可以使用的格式有:
格式 描述
%a 縮寫星期名
%b 縮寫月名
%c 月,數值
%D 帶有英文前綴的月中的天
%d 月的天,數值(00-31)
%e 月的天,數值(0-31)
%f 微秒
%H 小時 (00-23)
%h 小時 (01-12)
%I 小時 (01-12)
%i 分鐘,數值(00-59)
%j 年的天 (001-366)
%k 小時 (0-23)
%l 小時 (1-12)
%M 月名
%m 月,數值(00-12)
%p AM 或 PM
%r 時間,12-小時(hh:mm:ss AM 或 PM)
%S 秒(00-59)
%s 秒(00-59)
%T 時間, 24-小時 (hh:mm:ss)
%U 周 (00-53) 星期日是一周的第一天
%u 周 (00-53) 星期一是一周的第一天
%V 周 (01-53) 星期日是一周的第一天,與 %X 使用
%v 周 (01-53) 星期一是一周的第一天,與 %x 使用
%W 星期名
%w 周的天 (0=星期日, 6=星期六)
%X 年,其中的星期日是周的第一天,4 位,與 %V 使用
%x 年,其中的星期一是周的第一天,4 位,與 %v 使用
%Y 年,4 位
%y 年,2 位

實例
下面的腳本使用 DATE_FORMAT() 函數來顯示不同的格式。我們使用 NOW() 來獲得當前的日期/時間:
DATE_FORMAT(NOW(),'%b %d %Y %h:%i %p')
DATE_FORMAT(NOW(),'%m-%d-%Y')
DATE_FORMAT(NOW(),'%d %b %y')
DATE_FORMAT(NOW(),'%d %b %Y %T:%f')
結果類似:
Dec 29 2008 11:45 PM
12-29-2008
29 Dec 08
29 Dec 2008 16:25:46.635

MySQL 使用下列數據類型在數據庫中存儲日期或日期/時間值:
DATE - 格式 YYYY-MM-DD
DATETIME - 格式: YYYY-MM-DD HH:MM:SS
TIMESTAMP - 格式: YYYY-MM-DD HH:MM:SS
YEAR - 格式 YYYY 或 YY

SQL 日期處理
如果不涉及時間部分,那么我們可以輕松地比較兩個日期!
假設我們有下面這個 "Orders" 表:
我們希望從上表中選取 OrderDate 為 "2008-12-26" 的記錄。
使用如下 SELECT 語句:
SELECT * FROM Orders WHERE OrderDate='2008-12-26'

提示:如果您希望使查詢簡單且更易維護,那么請不要在日期中使用時間部分!

SQL NULL 值
NULL 值是遺漏的未知數據。
默認地,表的列可以存放 NULL 值。
本章講解 IS NULL 和 IS NOT NULL 操作符。

SQL NULL 值
如果表中的某個列是可選的,那么我們可以在不向該列添加值的情況下插入新記錄或更新已有的記錄。這意味著該字段將以 NULL 值保存。
NULL 值的處理方式與其他值不同。
NULL 用作未知的或不適用的值的占位符。
注釋:無法比較 NULL 和 0;它們是不等價的。
看下面的 "Persons" 表:
假如 "Persons" 表中的 "Address" 列是可選的。這意味著如果在 "Address" 列插入一條不帶值的記錄,"Address" 列會使用 NULL 值保存。

那么我們如何測試 NULL 值呢?
無法使用比較運算符來測試 NULL 值,比如 =, <, 或者 <>。
我們必須使用 IS NULL 和 IS NOT NULL 操作符。
我們如何僅僅選取在 "Address" 列中帶有 NULL 值的記錄呢?
我們必須使用 IS NULL 操作符:
SELECT LastName,FirstName,Address
FROM Persons    WHERE Address IS NULL
提示:請始終使用 IS NULL 來查找 NULL 值。

我們如何選取在 "Address" 列中不帶有 NULL 值的記錄呢?
我們必須使用 IS NOT NULL 操作符:
SELECT LastName,FirstName,Address FROM Persons
WHERE Address IS NOT NULL

下面的 "Products" 表:
假如 "UnitsOnOrder" 是可選的,而且可以包含 NULL 值。

使用如下 SELECT 語句:
SELECT ProductName,UnitPrice*(UnitsInStock+UnitsOnOrder)
FROM Products

在上面的例子中,如果有 "UnitsOnOrder" 值是 NULL,那么結果是 NULL。
微軟的 ISNULL() 函數用于規(guī)定如何處理 NULL 值。
NVL(), IFNULL() 和 COALESCE() 函數也可以達到相同的結果。
在這里,我們希望 NULL 值為 0。
下面,如果 "UnitsOnOrder" 是 NULL,則不利于計算,因此如果值是 NULL 則 ISNULL() 返回 0。

MySQL
MySQL 也擁有類似 ISNULL() 的函數。不過它的工作方式與微軟的 ISNULL() 函數有點不同。
在 MySQL 中,我們可以使用 IFNULL() 函數,就像這樣:
SELECT ProductName,UnitPrice(UnitsInStock+IFNULL(UnitsOnOrder,0))
FROM Products
或者我們可以使用 COALESCE() 函數,就像這樣:
SELECT ProductName,UnitPrice
(UnitsInStock+COALESCE(UnitsOnOrder,0))
FROM Products

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容