SQL Server 常用函數和日期操作

來源:互聯網
上載者:User

以下資料收集自 http://hi.baidu.com/delphistu,http://hi.baidu.com/zhvsby

可能敘述有誤,使用者請自我驗證

 

SQL Server 常用函數集合

一、字元轉換函式
1、ASCII()
返回字元運算式最左端字元的ASCII 碼值。在ASCII()函數中,純數位字串可不用‘’括起來,但含其它字元的字串必須用‘’括起來使用,否則會出錯。
2、CHAR()
將ASCII 碼轉換為字元。如果沒有輸入0 ~ 255 之間的ASCII 碼值,CHAR() 返回NULL 。
3、LOWER()和UPPER()
LOWER()將字串全部轉為小寫;UPPER()將字串全部轉為大寫。
4、STR()
把數值型資料轉換為字元型資料。
STR (<float_expression>[,length[, <decimal>]])
length 指定返回的字串的長度,decimal 指定返回的小數位元。如果沒有指定長度,預設的length 值為10, decimal 預設值為0。
當length 或者decimal 為負值時,返回NULL;
當length 小於小數點左邊(包括符號位)的位元時,返回length 個*;
先服從length ,再取decimal ;
當返回的字串位元小於length ,左邊補足空格。
二、去空格函數
1、LTRIM() 把字串頭部的空格去掉。

2、RTRIM() 把字串尾部的空格去掉。

三、取子串函數
1、left()
LEFT (<character_expression>, <integer_expression>)
返回character_expression 左起 integer_expression 個字元。

2、RIGHT()
RIGHT (<character_expression>, <integer_expression>)
返回character_expression 右起 integer_expression 個字元。

3、SUBSTRING()
SUBSTRING (<expression>, <starting_ position>, length)
返回從字串左邊第starting_ position 個字元起length個字元的部分。

四、字串比較函數
1、CHARINDEX()
返回字串中某個指定的子串出現的開始位置。
CHARINDEX (<’substring_expression’>, <expression>)
其中substring _expression 是所要尋找的字元運算式,expression 可為字串也可為列名運算式。如果沒有發現子串,則返回0 值。
此函數不能用於TEXT 和IMAGE 資料類型。

2、PATINDEX()
返回字串中某個指定的子串出現的開始位置。
PATINDEX (<’%substring _expression%’>, <column_ name>)其中子串運算式前後必須有百分比符號“%”否則傳回值為0。
與CHARINDEX 函數不同的是,PATINDEX函數的子串中可以使用萬用字元,且此函數可用於CHAR、 VARCHAR 和TEXT 資料類型。

五、字串操作函數
1、QUOTENAME()
返回被特定字元括起來的字串。
QUOTENAME (<’character_expression’>[, quote_ character]) 其中quote_ character 標明括字串所用的字元,預設值為“[]”。

2、REPLICATE()
返回一個重複character_expression 指定次數的字串。
REPLICATE (character_expression integer_expression) 如果integer_expression 值為負值,則返回NULL 。

3、REVERSE()
將指定的字串的字元排列順序顛倒。
REVERSE (<character_expression>) 其中character_expression 可以是字串、常數或一個列的值。

4、REPLACE()
返回被替換了指定子串的字串。
REPLACE (<string_expression1>, <string_expression2>, <string_expression3>) 用string_expression3 替換在string_expression1 中的子串string_expression2。

4、SPACE()
返回一個有指定長度的空白字串。
SPACE (<integer_expression>) 如果integer_expression 值為負值,則返回NULL 。

5、STUFF()
用另一子串替換字串指定位置、長度的子串。
STUFF (<character_expression1>, <start_ position>, <length>,<character_expression2>)
如果起始位置為負或長度值為負,或者起始位置大於character_expression1 的長度,則返回NULL 值。
如果length 長度大於character_expression1 中 start_ position 以右的長度,則character_expression1 只保留首字元。
六、資料類型轉換函式
1、CAST()
CAST (<expression> AS <data_ type>[ length ])

2、CONVERT()
CONVERT (<data_ type>[ length ], <expression> [, style])

1)data_type為SQL Server系統定義的資料類型,使用者自訂的資料類型不能在此使用。
2)length用於指定資料的長度,預設值為30。
3)把CHAR或VARCHAR類型轉換為諸如INT或SAMLLINT這樣的INTEGER類型、結果必須是帶正號或負號的數值。
4)TEXT類型到CHAR或VARCHAR類型轉換最多為8000個字元,即CHAR或VARCHAR資料類型是最大長度。
5)IMAGE類型儲存的資料轉換到BINARY或VARBINARY類型,最多為8000個字元。
6)把整數值轉換為MONEY或SMALLMONEY類型,按定義的國家的貨幣單位來處理,如人民幣、美元、英鎊等。
7)BIT類型的轉換把非零值轉換為1,並仍以BIT類型儲存。
8)試圖轉換到不同長度的資料類型,會截短轉換值並在轉換值後顯示“+”,以標識發生了這種截斷。
9)用CONVERT() 函數的style. 選項能以不同的格式顯示日期和時間。style. 是將DATATIME 和SMALLDATETIME 資料轉換為字串時所選用的由SQL Server 系統提供的轉換樣式編號,不同的樣式編號有不同的輸出格式。
七、日期函數
1、day(date_expression)
返回date_expression中的日期值

2、month(date_expression)
返回date_expression中的月份值

3、year(date_expression)
返回date_expression中的年份值

4、DATEADD()
DATEADD (<datepart>, <number>, <date>)
返回指定日期date 加上指定的額外日期間隔number 產生的新日期。

5、DATEDIFF()
DATEDIFF (<datepart>, <date1>, <date2>)
返回兩個指定日期在datepart 方面的不同之處,即date2 超過date1的差距值,其結果值是一個帶有加號或減號的整數值。

6、DATENAME()
DATENAME (<datepart>, <date>)
以字串的形式返回日期的指定部分此部分。由datepart 來指定。

7、DATEPART()
DATEPART (<datepart>, <date>)
以整數值的形式返回日期的指定部分。此部分由datepart 來指定。
DATEPART (dd, date) 等同於DAY (date)
DATEPART (mm, date) 等同於MONTH (date)
DATEPART (yy, date) 等同於YEAR (date)

8、GETDATE()
以DATETIME 的預設格式返回系統當前的日期和時間

 

舉例:

 

  1. 1、SUBSTRING, REVERSE
  2. 把使用者電話號碼中,倒數第三位是2,倒數第二位是6,最後一位是偶數的號碼列出來
  3. create table tab1 (tel varchar(50))
  4. select * from tab1
  5. insert into tab1 values('13455555555')
  6. insert tab1 values('13455555266')
  7. insert tab1 values('13455555557')
  8. insert tab1 values('13455555258')
  9. insert tab1 values('13455555269')
  10. select * from tab1
  11. select * from tab1 where substring(REVERSE(tel),3,1)=2
  12. select * from tab1 where substring(REVERSE(tel),3,1)=2 and substring(REVERSE(tel),2,1)=6
  13. select * from tab1 where substring(REVERSE(tel),3,1)=2 and substring(REVERSE(tel),2,1)=6
  14. and substring(REVERSE(tel),1,1)%2=0
  15. 2、REPLICATE
  16.        Select Replicate('abc',2) 
  17. 結果:abcabc
  18.         Select Replicate('abc',-2) 
  19. 結果:null
  20.         Select Replicate('abc',0)
  21. 結果:無(空串)
  22. 3、QUOTENAME
  23. Select QuoteName ('abc[ ]def','{')
  24. 結果: {abc[ ]def}
  25. Select QuoteName ('abc[ ]def')
  26. 結果: [abc[ ]def]
  27. 預設情況下是[]
  28. 4、STUFF,SPACE
  29. 資料庫表中有三個欄位,要以xxxx-xxxxxx-xxxxxx的格式輸出,其中不滿相應位元的,在後面補空格
  30. 即把類似23,1234,879這樣的三個數以如下形式輸出到報表中:23__-1234__-879___的格式輸出,標註顏色的底線一種顏色代表一個空格。 
  31. STUFF(SPACE(4),1,LEN(‘23’),’23’)+’-’+STUFF(SPACE(6),1,LEN(‘1234’),’1234’)+’-’+ STUFF(SPACE(6),1,LEN(‘879’),’879’)
  32. 5、STR
  33. print STR(12,10)  
  34. 結果: 12
  35. print STR(1223, 2)
  36. 結果: **
  37. print STR(123.46,8,1)
  38. 結果: ###123.5    其中#代表空格 該結果總長度為8 ,取一位小數,小數為四捨五入,同時該SQL語句如果取3個小數的話補零操作
  39. 6、CHARINDEX
  40. select charindex('ea','abcdeabcd')
  41. 結果: 5
  42. 7、PATINDEX
  43. 例一:
  44. 找出Northwind.dbo.Categories表中Description欄位中是包含單詞“Bread”或“bread”的所有記錄,那麼選擇語句就可能是這樣:
  45. Select Description from Northwind.dbo.Categories
  46. Where patindex('%[b,B]read%',description) > 0
  47. PATINDEX 中可以使用萬用字元來確定大寫和小寫“b”
  48. 例二:
  49. 找出Northwind.dbo.Categories表中Description欄位中是包含單詞“Bread”或“bread”,且第二子字母不是“e”的記錄。
  50. select Description from Northwind.dbo.Categories     
  51. where patindex('%[b,B]read%',description) > 0 and patindex('_[^e]%',description) = 1 
  52. 通過在條件陳述式中增加一個使用^萬用字元的PATINDEX函數,我們可以過濾掉“Dessert, candies, and sweet breads”這條記錄。上面的查詢結果只有一條記錄。

SQL Server 日期時間格式化

Select CONVERT(varchar(100), GETDATE(), 0): 05 16 2006 10:57AM
Select CONVERT(varchar(100), GETDATE(), 1): 05/16/06
Select CONVERT(varchar(100), GETDATE(), 2): 06.05.16
Select CONVERT(varchar(100), GETDATE(), 3): 16/05/06
Select CONVERT(varchar(100), GETDATE(), 4): 16.05.06
Select CONVERT(varchar(100), GETDATE(), 5): 16-05-06
Select CONVERT(varchar(100), GETDATE(), 6): 16 05 06
Select CONVERT(varchar(100), GETDATE(), 7): 05 16, 06
Select CONVERT(varchar(100), GETDATE(), 8): 10:57:46
Select CONVERT(varchar(100), GETDATE(), 9): 05 16 2006 10:57:46:827AM
Select CONVERT(varchar(100), GETDATE(), 10): 05-16-06
Select CONVERT(varchar(100), GETDATE(), 11): 06/05/16
Select CONVERT(varchar(100), GETDATE(), 12): 060516
Select CONVERT(varchar(100), GETDATE(), 13): 16 05 2006 10:57:46:937
Select CONVERT(varchar(100), GETDATE(), 14): 10:57:46:967
Select CONVERT(varchar(100), GETDATE(), 20): 2006-05-16 10:57:47
Select CONVERT(varchar(100), GETDATE(), 21): 2006-05-16 10:57:47.157
Select CONVERT(varchar(100), GETDATE(), 22): 05/16/06 10:57:47 AM
Select CONVERT(varchar(100), GETDATE(), 23): 2006-05-16
Select CONVERT(varchar(100), GETDATE(), 24): 10:57:47
Select CONVERT(varchar(100), GETDATE(), 25): 2006-05-16 10:57:47.250
Select CONVERT(varchar(100), GETDATE(), 100): 05 16 2006 10:57AM
Select CONVERT(varchar(100), GETDATE(), 101): 05/16/2006
Select CONVERT(varchar(100), GETDATE(), 102): 2006.05.16
Select CONVERT(varchar(100), GETDATE(), 103): 16/05/2006
Select CONVERT(varchar(100), GETDATE(), 104): 16.05.2006
Select CONVERT(varchar(100), GETDATE(), 105): 16-05-2006
Select CONVERT(varchar(100), GETDATE(), 106): 16 05 2006
Select CONVERT(varchar(100), GETDATE(), 107): 05 16, 2006
Select CONVERT(varchar(100), GETDATE(), 108): 10:57:49
Select CONVERT(varchar(100), GETDATE(), 109): 05 16 2006 10:57:49:437AM
Select CONVERT(varchar(100), GETDATE(), 110): 05-16-2006
Select CONVERT(varchar(100), GETDATE(), 111): 2006/05/16
Select CONVERT(varchar(100), GETDATE(), 112): 20060516
Select CONVERT(varchar(100), GETDATE(), 113): 16 05 2006 10:57:49:513
Select CONVERT(varchar(100), GETDATE(), 114): 10:57:49:547
Select CONVERT(varchar(100), GETDATE(), 120): 2006-05-16 10:57:49
Select CONVERT(varchar(100), GETDATE(), 121): 2006-05-16 10:57:49.700
Select CONVERT(varchar(100), GETDATE(), 126): 2006-05-16T10:57:49.827
Select CONVERT(varchar(100), GETDATE(), 130): 18 ???? ?????? 1427 10:57:49:907AM
Select CONVERT(varchar(100), GETDATE(), 131): 18/04/1427 10:57:49:920AM

常用:
Select CONVERT(varchar(100), GETDATE(), 8): 10:57:46
Select CONVERT(varchar(100), GETDATE(), 24): 10:57:47
Select CONVERT(varchar(100), GETDATE(), 108): 10:57:49
Select CONVERT(varchar(100), GETDATE(), 12): 060516
Select CONVERT(varchar(100), GETDATE(), 23): 2006-05-16

 

SQL Server 日期操作集合

DECLARE @dt datetime
SET @dt=GETDATE()

--1.短日期格式:yyyy-m-d
SELECT REPLACE(CONVERT(varchar(10),@dt,120),N'-0','-')

--2.長日期格式:yyyy年mm月dd日
--A. 方法1
SELECT STUFF(STUFF(CONVERT(char(8),@dt,112),5,0,N'年'),8,0,N'月')+N'日'
--B. 方法2
SELECT DATENAME(Year,@dt)+N'年'+DATENAME(Month,@dt)+N'月'+DATENAME(Day,@dt)+N'日'

--3.長日期格式:yyyy年m月d日
SELECT DATENAME(Year,@dt)+N'年'+CAST(DATEPART(Month,@dt) AS varchar)+N'月'+DATENAME(Day,@dt)+N'日'

--4.完整日期+時間格式:yyyy-mm-dd hh:mi:ss:mmm
SELECT CONVERT(char(11),@dt,120)+CONVERT(char(12),@dt,114)

2、日期推算處理

DECLARE @dt datetime
SET @dt=GETDATE()

DECLARE @number int
SET @number=3

--1.指定日期該年的第一天或最後一天
--A. 年的第一天
SELECT CONVERT(char(5),@dt,120)+'1-1'

--B. 年的最後一天
SELECT CONVERT(char(5),@dt,120)+'12-31'

--2.指定日期所在季度的第一天或最後一天
--A. 季度的第一天
SELECT CONVERT(datetime,
CONVERT(char(8),
DATEADD(Month,
DATEPART(Quarter,@dt)*3-Month(@dt)-2,
@dt),
120)+'1')

--B. 季度的最後一天(CASE判斷法)
SELECT CONVERT(datetime,
CONVERT(char(8),
DATEADD(Month,
DATEPART(Quarter,@dt)*3-Month(@dt),
@dt),
120)
+CASE WHEN DATEPART(Quarter,@dt) in(1,4)
THEN '31'ELSE '30' END)

--C. 季度的最後一天(直接推演算法)
SELECT DATEADD(Day,-1,
CONVERT(char(8),
DATEADD(Month,
1+DATEPART(Quarter,@dt)*3-Month(@dt),
@dt),
120)+'1')

--3.指定日期所在月份的第一天或最後一天
--A. 月的第一天
SELECT CONVERT(datetime,CONVERT(char(8),@dt,120)+'1')

--B. 月的最後一天
SELECT DATEADD(Day,-1,CONVERT(char(8),DATEADD(Month,1,@dt),120)+'1')

--C. 月的最後一天(這種方法是錯誤的,只有擷取8月份最後一天才能得到正確解)
SELECT DATEADD(Month,1,DATEADD(Day,-DAY(@dt),@dt))

--4.指定日期所在周的任意一天
SELECT DATEADD(Day,@number-DATEPART(Weekday,@dt),@dt)

--5.指定日期所在周的任意星期幾
--A. 星期天做為一周的第1天
SELECT DATEADD(Day,@number-(DATEPART(Weekday,@dt)+@@DATEFIRST-1)%7,@dt)

--B. 星期一做為一周的第1天
SELECT DATEADD(Day,@number-(DATEPART(Weekday,@dt)+@@DATEFIRST-2)%7-1,@dt)

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.