·
SQL Server 日期時間數據類型有哪些
1、日期和時間數據類型
(1)在sqlserver 2008之前,SQL Server 支持datetime 和 smalldatetime 兩種日期時間數據類型、這兩種數據類型日期和時間是不可分割的、差異在日期范圍、精度方面
(2)sql server 2008引入date 和 time 、datetime2、datetimeoffset數據類型、其中datetime2比date范圍更大,精度更高、datetimeoffset 有一個時間偏移量組件
(3)datetime 精確到毫秒,time 和 datetime 精確到100納秒
(4)time 、datetime2 、datetimeoffset 的存儲需求取決於精度、以整數 0~7 表示秒的小數部分的精度、如TIME(0),表示小數部分為0位,精確到秒,TIME(3)表示精確到毫秒
2、日期和時間常量
(1)日期和時間常量,說白了就是日期時間類型的文本值,如orderdate = '20070212'
(2) Sql server將 文本‘20070212’ 識別為字符串常量、而不是日期和時間常量,但是由於 orderdate = '20070212' 涉及兩種類型的操作數、所以必須有一個隱式轉換,類型轉換的方向基於數據類型的優先級、日期類型優先級高於字符串
(3)此外也可以進行顯式轉換
cast('20070212' as datetime)
(4)日期格式與語言有關系,如中英文日期格式不同,sql server 將日期字符串轉換成日期時,基於會話的有效語言轉換
(5)convert(datetime, '02/12/2007' ,101)顯式轉換字符串常量,第3個參數中指定一個代表所使用格式的數字、網上有編碼與格式的映射表格(The Cast and Convert Functions)
3、日期篩選的優化細節
(1)使用日期函數 year 、month 是無法使用索引的
-- 以下sql 無法使用到索引 select orderid ,custid ,empid ,orderdate from Sales.Orders where year(orderdate) = 2007;
(2)應該使用以下方案替代
select orderid ,custid ,empid, orderdate from Sales.Orders where orderdate>= '20070101' and orderdate < '20080101'
4、日期與事件函數
4.1 返回當前日期和時間
(1)getdate() , 返回datetime類型、當前日期時間
(2)current_timestamp , 等價於getdate() ,返回值是datetime ,不用帶括號,是標准ANSI SQL,推薦使用
(3) sysdatetime 返回的是datetime2
4.2指定格式字符串轉換成日期
4.2.1 cast 、convert 、parse 、try_
(1)cast(value as datatype) 、convert(datetyepe,vulue,stylenumber)、parse( value as datatype using culture)
(2)cast convert parse 函數當源數據無法轉換成日期會報錯,如果加了try_前綴 函數返回null ,不會報錯
(3)cast 是ANSI SQL,convert 和parse 不是,所以除非需要使用到樣式編碼或趨於編碼,盡量使用Cast
(4) convert 和其他兩個參數不一樣、第一個參數是dateype ,第二步才是value,
(5)convert 既可以將字符串轉時間,也可以將時間轉成指定字符串
-- 字符串轉時間 select convert(datetime, '02/12/2007' ,101) -- 時間轉字符串,一下返回當前年月日'20190406' select convert(char(8),current_timestamp,112)
4.2.2 dateadd 函數
(1)該函數用於為指定日期部分增加一個指定的單位數量到輸入的日期時間值總
(2)語法 dateadd(part, n, dt_val)
(3) part 的有效輸入值有 year、 quarter 、month 、week 、day 、hour 、minute、 second 、second 等,更多的參閱SQL Server 聯機叢書
-- 加一年 select dateadd(year,1,'20090212')
4.2.3 datediff函數
(1) datediff 函數返回兩個日期和時間值之間在指定日期部分的差異
-- 計算一下兩個日期相差多少天,返回366天 select datediff(day,'20080212','20090212')
(2)part 和前面一樣
(3)是后面的日期,減去前面的日期
4.2.4 datepart函數
(1) datepart 返回一個表示所請求日期或時間值部分的整數
-- 返回2 datepart(month,'20070212')
(2) year(dt_val) 、month(dt_val) 、day(dt_val) 實際是datepart 的縮寫
4.2.5 isdate函數
isdate(str) ,字符串能轉換成時間返回1 ,不能返回0
4.2.6 fromparts 函數
(1)在sqlserver 2012 引入,用於接收各個部分的整數值構建對應類型
(2)格式
datefromparts(year,month,day) datetimefromparts(year,month, day, minute, seconds,millisseconds)
4.2.7 eomonth
(1)sqlserver 2012 中引入、用戶接受一個日期和時間值輸入,返回月末午夜日期
-- 返回當月月末日期 select eomonth(current_timestamp)
(2) 第二個參數可選,指示在原來的基礎上增加多少個月
--下個月的最后一天 select eomonth(current_timestamp,1)
·