1. 程式人生 > >日期時間函式

日期時間函式

日期時間型別的資料也是經常用到的,比如員工出生日期、結賬日期、入庫日期等等,而且經常需要對這些資料進行處理,比如檢索所有超過保質期的商品、將結賬日期向後延遲3天、檢索所有每個月18日的入庫記錄,進行這些處理就需要使用日期時間函式。SQL中提供了豐富的日期時間函式用於完成這些功能,本節將對這些日期時間函式進行詳細講解。

  • 日期、時間、日期時間與時間戳

根據表示的型別、精度的不同,資料庫中的日期時間資料型別分為日期、時間、日期時間以及時間戳四種類型。

日期型別是用來表示“年-月-日”資訊的資料型別,其精度精確到“日”,其中包含了年、月、日三個資訊,比如“2008-08-08”。日期型別可以用來表示“北京奧運會開幕式日期”、“王小明的出生年月日”等資訊,但是無法表示“最近一次遲到的時間”、“徐總抵京時間”等精確到小時甚至分秒的資料。在資料庫中,一般用Date來表示日期型別。

時間型別是用來表示“小時:分:秒”資訊的資料型別,其精度精確到“秒”,其中包含了小時、分、秒三個資訊,比如“19:00:00”。時間型別可以用來表示“每天《新聞聯播》的播出時間”、“每天的下班時間”等資訊,但是無法表示“盧溝橋事變爆發日期”、“上次結賬時間”等包含“年-月-日”等資訊的資料。在資料庫中,一般用Time來表示時間型別。

日期時間型別是用來表示“年-月-日小時:分:秒”資訊的資料型別,其精度精確到“秒”,其中包含了年、月、日、小時、分、秒六個資訊,比如“2008-08-08 08:00:00”。日期時間型別可以用來表示“北京奧運會開幕式準確時間”、“上次遲到時間”等資訊。在資料庫中,一般用DateTime來表示日期時間型別。

日期時間型別的精度精確到“秒”,這在一些情況下能夠滿足基本的要求,但是對於精度要求更加高的日期時間資訊則無法表示,比如“劉翔跑到終點的時間”、“貨物A經過射頻識別器的時間”等更高精度要求的資訊。資料庫中提供了時間戳型別用於表示這些對精度要求更加高的場合。時間戳型別還可以用於標記表中資料的版本資訊,比如我們想區分表中兩條記錄插入表中的先後順序,由於資料庫操作速度非常快,如果用DateTime 型別記錄輸入插入時間的話,若兩條記錄插入的時間間隔非常短的話是無法區分它們的,這時就可以使用時間戳型別。在有的資料庫系統中,如果對資料表中的記錄進行了更新的話,資料庫系統會自動更新其中的時間戳欄位的值。資料庫中,一般用TimeStamp來表示日期時間型別。

不同的資料庫系統對日期、時間、日期時間與時間戳等資料型別的支援差異性非常大,有的資料型別在有的資料庫系統中不被支援,而有的資料型別的表示精度則和其型別名稱所暗示的精度不同,比如MSSQLServer中不支援Time型別、Oracle中的Date型別中包含時間資訊。資料庫中的日期時間函式對這些型別的支援差別是非常小的,因此在一般情況下我們將這些型別統一稱為“日期時間型別”。

  • 主流資料庫系統中日期時間型別的表示方式

在MYSQL、MSSQLServer和DB2中可以用字串來表示日期時間型別,資料庫系統會自動在內部將它們轉換為日期時間型別,比如“"2008-08-08"”、“2008-08-08 08:00:00”、“08:00:00” 、“2008-08-08 08:00:00.000000”等。在Oracle中以字串表示的資料是不能自動轉換為日期時間型別的,必須使用TO_DATE()函式來手動將字串轉換為日期時間型別的,比如TO_DATE("2008-08-08","YYYY-MM-DD HH24:MI:SS") 、TO_DATE("2008-08-08 08:00:00", "YYYY-MM-DD HH24:MI:SS")、TO_DATE("08:00:00", "YYYY-MM-DD HH24:MI:SS")等。

  • 取得當前日期時間

在系統中經常需要使用當前日期時間進行處理,比如將“入庫時間”欄位設定為當前日期時間,在SQL中提供了取得當前日期時間的方式,不過各個資料庫中的實現方式各不相同。

  • MYSQL

MYSQL中提供了NOW()函式用於取得當前的日期時間,NOW()函式還有SYSDATE()、CURRENT_TIMESTAMP等別名。如下:


SELECT NOW(),SYSDATE(),CURRENT_TIMESTAMP

執行完畢我們就能在輸出結果中看到下面的執行結果:


NOW() SYSDATE() CURRENT_TIMESTAMP

2008-01-12 01:13:19 2008-01-12 01:13:19 2008-01-12 01:13:19 

如果想得到不包括時間部分的當前日期,則可以使用CURDATE()函式,CURDATE()函式還有CURRENT_DATE等別名。如下:


SELECT CURDATE(),CURRENT_DATE

執行完畢我們就能在輸出結果中看到下面的執行結果:


CURDATE() CURRENT_DATE

2008-01-12 2008-01-12

如果想得到不包括日期部分的當前時間,則可以使用CURTIME()函式,CURTIME()函式還有CURRENT_TIME等別名。如下:


SELECT CURTIME(),CURRENT_TIME

執行完畢我們就能在輸出結果中看到下面的執行結果:


CURTIME() CURRENT_TIME

01:17:09 01:17:09 
  • MSQLServer

MSSQLServer中用於取得當前日期時間的函式為GETDATE()。如下:


SELECT GETDATE() as 當前日期時間

執行完畢我們就能在輸出結果中看到下面的執行結果:

```java 當前日期時間 2008-01-12 01:02:04.78 

可以看到GETDATE()返回的資訊是包括了日期、時間(精確到秒以後部分)的時間戳資訊。MSSQLServer 沒有專門提供取得當前日期、取得當前時間的函式,不過我們可以將GETDATE()的返回值進行處理,這裡需要藉助於Convert()函式。

使用CONVERT(VARCHAR(50) ,日期時間值, 101)可以得到日期時間值的日期部分,因此下面的SQL語句可以得到當前的日期值:

SELECT CONVERT(VARCHAR(50) ,GETDATE( ), 101) as 當前日期

執行完畢我們就能在輸出結果中看到下面的執行結果:


當前日期

01/14/2008

使用CONVERT(VARCHAR(50),日期時間值,108)可以得到日期時間值的日期部分,因此下面的SQL語句可以得到當前的日期值:


SELECT CONVERT(VARCHAR(50) ,GETDATE(), 108) as 當前時間 

執行完畢我們就能在輸出結果中看到下面的執行結果:


當前時間

21:37:19
  • Oracle

Oracle中沒有提供取得當前日期時間的函式,不過我們可以到系統表DUAL 中查詢SYSTIMESTAMP的值來得到當前的時間戳。如下:


SELECT SYSTIMESTAMP FROM DUAL

執行完畢我們就能在輸出結果中看到下面的執行結果:


SYSTIMESTAMP

2008-1-14 21.46.42.78000000 8:0 

同樣,我們可以到系統表DUAL中查詢SYSDATE 的值來得到當前日期時間。如下:


SELECT SYSDATE FROM DUAL

執行完畢我們就能在輸出結果中看到下面的執行結果:


SYSDATE

2008-01-14 21:47:16.0 

同樣,Oracle中也沒有專門提供取得當前日期、取得當前時間的函式,不過我們可以將SYSDATE的值進行處理,這裡需要藉助於TO_CHAR()函式,這個函式的詳細介紹後面章節介紹,這裡只介紹它在日期處理方面的應用。

使用 TO_CHAR(時間日期值, "YYYY-MM-DD") 可以得到日期時間值的日期部分,因此下面的SQL語句可以得到當前的日期值:


SELECT TO_CHAR(SYSDATE, "YYYY-MM-DD") FROM DUAL

執行完畢我們就能在輸出結果中看到下面的執行結果:


TO_CHAR(SYSDATE,YYYY-MM-DD)

2008-01-14

使用TO_CHAR(時間日期值, "HH24:MI:SS") 可以得到日期時間值的時間部分,因此下面的SQL語句可以得到當前的日期值:


SELECT TO_CHAR(SYSDATE, "HH24:MI:SS") FROM DUAL

執行完畢我們就能在輸出結果中看到下面的執行結果:


TO_CHAR(SYSDATE,HH24:MI:SS) 21:56:13 
  • DB2

DB2中同樣沒有提供取得當前日期時間的函式,不過我們可以到系統表SYSIBM.SYSDUMMY1中查詢CURRENT TIMESTAMP的值來得到當前時間戳。如下:


SELECT CURRENT TIMESTAMP FROM SYSIBM.SYSDUMMY1 

執行完畢我們就能在輸出結果中看到下面的執行結果:


1

2008-01-14-21.58.20.01515000

從系統表SYSIBM.SYSDUMMY1中查詢CURRENT DATE 的值來得到當前日期值。如下:


SELECT CURRENT DATE FROM SYSIBM.SYSDUMMY1 

執行完畢我們就能在輸出結果中看到下面的執行結果:


1

2008-01-14

從系統表SYSIBM.SYSDUMMY1中查詢CURRENT TIME的值來得到當前日期值。如下:


SELECT CURRENT TIME FROM SYSIBM.SYSDUMMY1 

執行完畢我們就能在輸出結果中看到下面的執行結果:


1

22:05:48