本篇文章還是學習《程序員的SQL金典》內容的記錄,此次將講解的是SQL SERVER的時間函數。
本文只講SQL SERVER支持的時間函數(其它數據庫這里就不羅列了,想看更多的可以關注《程序員的SQL金典》)。
對於時間來講,我想基礎的東西大家還是需要懂的,比如說,對於時間來說,有分:
(1)日期:表示“年-月-日”信息的數據類型,其精度精確到“日”,其中包含了年、月、日三個信息,比如“2008-08-08”。而無時間點的概念。在數據庫中,一般用Date來表示日期類型。
(2)時間:表示“小時:分:秒” 信息的數據類型,其精度精確到“秒”,其中包含了小時、分、秒三個信息,比如“19:00:00”。而無日期的概念。在數據庫中,一般用Time來表示時間類型。
(3)日期時間:表示“年-月-日 小時:分:秒” 信息的數據類型,其精度精確到“秒”,其中包含了年、月、日、小時、分、秒六個信息,比如“2008-08-08 08:00:00”。既包含了日期,也包含了時間點。在數據庫中,一般用DateTime來表示日期時間類型。
(4)時間戳:表示比日期時間精度更高精度的時間類型。比如我們想區分表中兩條記錄插入表中的先后順序,由於數據庫操作速度非常快,如果用DateTime 類型記錄輸入插入時間的話,若兩條記錄插入的時間間隔非常短的話是無法區分它們的,這時就可以使用時間戳類型。數據庫中,一般用TimeStamp來表示時間戳類型。
不同的數據庫系統對日期、時間、日期時間與時間戳等數據類型的支持差異性非常大,有的數據類型在有的數據庫系統中不被支持,而有的數據類型在不同的數據庫系統中表示精度和其類型名稱所暗示的精度不同,比如Oracle 中的Date 類型中包含時間信息。數據庫中的日期時間函數對這些類型的支持差別是非常小的,因此在一般情況下我們將這些類型統一稱為“日期時間類型”。
| GETDATE()函數 |
獲取得當前日期時間,返回的信息是包括了日期、時間(精確到秒以后部分)的時間戳信息。
SELECT GETDATE() as 當前日期時間
MSSQL Server 沒有專門提供取得當前日期、取得當前時間的函數。但是通過間接的方式也可以獲取到。主要是使用到Convert()函數。
獲取當前日期的方式:
SELECT CONVERT(VARCHAR(50) ,GETDATE( ), 101) as 當前日期
獲取當前日期的方式:
SELECT CONVERT(VARCHAR(50) ,GETDATE(), 108) as 當前時間
| DATEADD (datepart , number, date )函數 |
用於進行日期時間的加法運算,其中datepart參數是表示日期部分的參數(比如是以日期還是以月份相加等),number參數是具體的加數,正數代表向未來日期方向加,負數代表向過去日期方向減,date參數為待計算的日期時間類型數據。
SELECT DATEADD(MONTH, 1, GETDATE())
SELECT FBirthDay, DATEADD (YEAR ,3,FBirthDay) as threeyrs, DATEADD(QUARTER ,20,FBirthDay) as ttqutrs, DATEADD(MONTH ,68,FBirthDay) as sxtmonths, DATEADD(WEEK, -1000,FBirthDay) as thweeik FROM T_Person
datepart參數可以取的單位類型如下:
| 單位 | 別名 | 說明 |
| year | yy,yyyy | 年份 |
| quarter | qq,q | 季度 |
| month | mm,m | 月份 |
| dayofyear | dy,y | 當年度的第幾天 |
| day | dd,d | 日 |
| week | wk,ww | 當年度的第幾周 |
| weekday | dw,w | 星期幾 |
| hour | hh | 小時 |
| minute | mi,n | 分 |
| second | ss,s | 秒 |
| millisecond | ms | 毫秒 |
| DATEDIFF ( datepart , startdate , enddate )函數 |
用於計算兩個日期時間之間的差額。其中datepart參數表示日期部分的參數(比如只比較年還是只比較月等),startdate參數為起始日期時間類型數據;enddate參數為結束日期時間類型數據。
SELECT DATEDIFF(DAY, '2013/12/17 21:00:00', '2013/12/19 10:00:00')
SELECT FRegDay,FBirthDay,DATEDIFF(WEEK, FBirthDay, FRegDay) FROM T_Person
datepart參數可以取的單位類型如下:
| 單位 | 別名 | 說明 |
| year | yy, yyyy | 年 |
| quarter | qq, q | 季度 |
| month | mm, m | 月 |
| dayofyear | dy, y | 工作日 |
| day | dd, d | 天數 |
| week | wk, ww | 周 |
| Hour | hh | 小時 |
| minute | mi, n | 分鍾 |
| second | ss, s | 秒 |
| millisecond | ms | 毫秒 |
| DATENAME(datepart,date)函數 |
用來獲取一個日期的特定部分,比方只獲取年份或者是只獲取月份等。其中datepart參數是表示要返回的日期部分的參數(即如果是Year的話,則返回的是具體的年份),date參數為待計算日期。
SELECT FBirthDay,DATENAME(Weekday,FBirthDay), FRegDay,DATENAME(DW, FRegDay) FROM T_Person
datepart參數可以取的單位類型如下:
| 單位 | 別名 | 說明 |
| Year | yy、yyyy | 年份 |
| Quarter | qq, q | 季度 |
| Month | mm, m | 月份 |
| Dayofyear | dy, y | 每年的某一日 |
| Day | dd, d | 日期 |
| Week | wk, ww | 星期 |
| Weekday | dw | 工作日 |
| Hour | hh | 小時 |
| Minute | mi, n | 分鍾 |
| Second | ss, s | 秒 |
| Millisecond | ms | 毫秒 |
| DATEPART (datepart,date)函數 |
MSSQL SERVER提供另一個函數也同樣可以實現獲取日期時間特定部分。其中datepart參數是表示要返回的日期部分的參數(即如果是Year的話,則返回的是具體的年),date參數為待計算日期。
SELECT FBirthDay, DATEPART(Dayofyear,FBirthDay), FRegDay, DATEPART(Year, FRegDay) FROM T_Person
datepart參數可以取的單位類型如下:
| 單位 | 別名 | 說明 |
| Year | yy、yyyy | 年份 |
| Quarter | qq, q | 季度 |
| Month | mm, m | 月份 |
| Dayofyear | dy, y | 每年的某一日 |
| Day | dd, d | 日期 |
| Week | wk, ww | 星期 |
| Weekday | dw | 工作日 |
| Hour | hh | 小時 |
| Minute | mi, n | 分鍾 |
| Second | ss, s | 秒 |
| Millisecond | ms | 毫秒 |
注:DATEPART()函數的返回值是數字,而DATENAME()函數則會將盡可能以名稱的方式做為返回值。
