SQL SERVER函数总结

[TOC]

日期函数

SQL SERVER 的时间格式只能为YYYY-MM-DD HH:MM:SS或YYYY/MM/DD HH:MM:SS(暂时试出这两个)

SQL SERVER 的字符串只能使用单引号

字段 格式 精度 存储大小 时间范围 示例
datetime yyyy-MM-dd HH:mm:ss.fff 3.33毫秒(ms) 8字节 1753-01-01~9999-12-31 2019-04-16 09:19:39.690
DATETIME2 yyyy-MM-dd HH:mm:ss.fffffff 0.1微秒(μs) 精度小于3的6个字节。精度3或4的7个字节,所有其他精度需要8个字节。 0001-01-01~9999-12-31 2019-04-16 09:22:19.3397144
smalldatetime yyyy-MM-dd HH:mm 秒数始终为0 4个字节,固定 1900-01-01~2079-06-06 2019-04-16 09:19:00
date YYYY-MM-DD 3个字节,固定 0001-01-01~9999-12-31 2019-04-16
time hh:mm:ss.[.nnnnnnn] 默认为0.1微妙(μs) 固定的5个字节是默认值 00:00:00.0000000~23:59:59.9999999 09:22:19.3397144
  • 在起始日期d加上n的日期,n的类型为dp: DATEADD(dp,n,d)

    SELECT DATEADD(Minute ,5,'2019-04-10 11:11:11'); -- 2019-04-10 11:16:11.000
    
  • 返回当前时间,为datetime类型:getDate()/ CURRENT_TIMESTAMP

    - SELECT GETDATE();  --2019-04-15 16:49:11.740
    - SELECT CURRENT_TIMESTAMP; --2019-04-15 16:54:05.677
    
  • 返回世界标准时间(处于东八区,所以有八个小时时差): getUTCDATE();

    SELECT GETUTCDATE(); --2019-04-15 08:49:11.740
    
  • 返回系统时间,为datetime2类型:SYSDATETIME()

    SELECT SYSDATETIME(); -- 2019-04-15 16:52:48.9306200
    
  • 计算 d1到d2间隔的dp单位的时间,d2-d1: DATEDIFF(dp,d1,d2)

    SELECT DATEDIFF(day,'2019-11-23','2019-11-13') ;-- -10
    
  • 返回表示指定时间d的指定 dp的字符串: DATENAME(d,dp)

    SELECT DATENAME(DW,'2019-04-16 11:12:13'); --星期二
    
  • 返回表示指定时间d 的指定 dp的整数: DATEPART(d,dp)

    SELECT DATEPART(DW,'2019-04-16 11:12:13');  -- 3
    
  • 返回指定时间d的“日”部分的整数: DAY(d)

    SELECT DAY('2019-04-16 11:12:13'); -- 16
    
  • 返回指定时间d的“月”部分的整数: MONTH(d)

    SELECT MONTH('2019-04-16 11:12:13'); -- 4
    
  • 返回指定时间d的“年”部分的整数: YEAR(d)

    SELECT YEAR('2019-04-16 11:12:13'); -- 2019
    
  • 返回表示指定年、月、日的date值:DATEFORMPARTS(year,month,day)

    SELECT DATEFROMPARTS(2019,04,16);  -- 2019-04-16
    
  • 为指定的日期和时间返回 datetime 值 DATETIMEFROMPARTS(year,month,day,hour,minute,seconds,milliseconds)

    SELECT DATETIMEFROMPARTS(2019,04,16,09,09,50,101);  -- 2019-04-16 09:09:50.100
    
  • 为指定的日期和时间返回 datetime2 值 DATETIME2FROMPARTS(year,month,day,hour,minute,seconds,fractions,精度)
    fractions表示秒的整数形式的整数表达式

    SELECT DATETIME2FROMPARTS(2019,04,16,09,09,50,20,7);  -- 2019-04-16 09:09:50.0000020
    
  • 为指定的日期和时间返回 smalldatetime 值。 SMALLDATETIMEFROMPARTS ( year, month, day, hour, minute )

    SELECT SMALLDATETIMEFROMPARTS(2019,04,16,10,02);  -- 2019-04-16 10:02:00
    
  • 对指定的时间返回 time 值(具有指定精度): TIMEFROMPARTS ( hour, minute, seconds, fractions, precision )

    SELECT TIMEFROMPARTS(10,05,32,5,3); -- 10:05:32.005
    
  • 返回包含指定日期所在月份的最后一天(具有可选偏移量) EOMONTH(strart_date[,month_to_add])

    SELECT EOMONTH('2019-04-16 11:11:11'); -- 2019-04-30
    SELECT EOMONTH('2019-04-16 11:11:11',-1); -- 2019-03-31
    
  • 如果表达式是有效的 date、time、或 datetime 值,则返回 1;否则返回 0。
    如果表达式为 datetime2 值,则 ISDATE 返回 0。

    SELECT ISDATE('2019-04-16 11:11:11'); -- 1
    SELECT ISDATE('2019-24-36 11:11:11');  -- 0
    SELECT ISDATE('2019-04-16 10:00:42.3344381'); -- 0
    
    

datepart(dp)类型

缩写(Sql Server) Access 和 ASP 说明
Year Yy yyyy 年 1753 ~ 9999
Quarter Qq q 季 1 ~ 4
Month Mm m 月1 ~ 12
Day of year Dy y 一年的日数,一年中的第几日 1-366
Day Dd d 日,1-31
Weekday Dw w 一周的日数,一周中的第几日 1-7
Week Wk ww 周,一年中的第几周 0 ~ 51
Hour Hh h 时0 ~ 23
Minute Mi n 分钟0 ~ 59
Second Ss s 秒 0 ~ 59
Millisecond Ms - 毫秒 0 ~ 999

字符串函数

ps:SQL SERVER下标从1开始计算

  • 返回字符c的ASCII编码 ASCII(c)

    SELECT ASCII('A');  -- 65
    
  • 返回数字i的所对应的ASCII编码字符 CHAR(i)

    SELECT CHAR(65); -- A
    
  • 返回字符串s的长度 LEN(s)

    SELECT LEN('helloworld'); -- 10
    
  • 合并字符串s1,s2...sn为一个字符串:CONCAT(s1,s2...sn)

    SELECT CONCAT('Hello','World','!') ; --  helloworld!
    
  • 合并字符串并添加分隔符x:CONCAT_WS(x,s1,s2...sn)

    SELECT CONCAT_WS('-','Hello','World','!') ;-- hello-world-!
    
  • 返回字符串str1在字符串str2中最开始的位置,可以指定start为开始位置,没找到返回0: CHARINDEX(str1,str2[,start])

    SELECT CHARINDEX('rld','helloworld',7); -- 8
    SELECT CHARINDEX('rld','helloworld'); -- 8
    SELECT CHARINDEX('rld','helloworld',9); -- 0
    
  • 返回字符模板str1(可以使用通配符,通配符详见下文@1)在字符串str2中最开始的位置,可以指定start为开始位置,没找到返回0;

    SELECT PATINDEX('w%','helloworld');  -- 查找以w开头的,返回0
    SELECT PATINDEX('%w%','helloworld'); -- 查找任意开头,任意结尾的字符串w的位置  返回6
    SELECT PATINDEX('%w','helloworld'); -- 查找以w结尾的字符串,返回 0
    
  • 将日期/时间和数字值格式化为识别区域设置的字符串: FORMAT ( value, format [, culture ] )

    SELECT FORMAT ( cast('10/01/2019'as date), 'D','en-us' ); -- Saturday, October 01, 2019
    
  • 将字符串s2替换字符s中的字符串s1:REPLACE(s,s1,s2)

     SELECT REPLACE('helloworld','ell','MySQL'); -- hMySQLoworld
    
  • 将字符串s重复n次: REOLICATE(s,n)

     SELECT REPLACE('helloworld','ell','MySQL'); -- hMySQLoworld
    
  • 将字符串s反转: REVERSE(s)

     SELECT REVERSE('hello')
    
  • 从左边开始截取字符串s,长度为n: LEFT(s,n)

     SELECT LEFT('helloworld',4); -- hell
    
  • 从左边开始截取字符串s,长度为n: * RIGHT(s,n)

     SELECT RIGHT('helloworld',4); -- orld
    
  • 截取指定位置的字符串: SUBSTRINg(s,start,len)

    
    SELECT SUBSTRING('helloworld',3,6); --llowor
    
  • 去掉字符串s开始处的空格: LTRIM(s)

    SELECT LTRIM('   hello'); -- hello
    
  • 去掉字符串s结尾处的空格:RTRIM(s)

    SELECT RTRIM('hello   '); -- hello
    
  • 去掉字符串s开始和结尾的空格: TRIM(s)

    SELECT TRIM( '     hello    '); -- hello
    
  • 将s中的字母全部转换为小写: LOWER()

    SELECT LOWER('HELLOWORLD'); -- helloworld
    
  • 将s中的字母全部转换为大写: UPPER()

    SELECT UPPER('helloworld'); -- HELLOWORLD
    
  • 字符串s2替换s1在x处的位置,替换长度为len: STUFF(s1,x,len,s2)

    SELECT STUFF('helloworld',6,2,'SQL'); --helloSQLrld
    
  • 返回由数字数据转换来的字符数据:STR(f[,len[,decimal]])
    f:带小数点的近似数字(float)数据类型的表达式
    len:总长度,包含小数点、符号、数字、以及空格。默认10.
    decimal:decimal必须小于等于16,如果大于16会被截断为小数点右边的16位。

    SELECT STR(123.45, 6, 1);  -- 123.5 会四舍五入
    SELECT STR(123.36,2,2); -- ** 如果长度过短,会显示*号
    
  • 返回一个由四个字符组成的代码 (SOUNDEX),用于评估两个字符串的相似性。 SOUNDEX(s)

    SELECT SOUNDEX ('Smith'), SOUNDEX ('Smythe');  -- S530 S530 
    
  • 该函数返回一个整数值,用于度量两个不同字符表达式的 SOUNDEX()值之间的差异。 DIFFERENCE(s1,s2)
    差异值范围0-4,0表示SOUNDEX 值之间相似性较弱或不相似,4表示SOUNDEX 值之间非常相似,甚至完全相同。

    SELECT SOUNDEX('Green'), SOUNDEX('Greene'), DIFFERENCE('Green','Greene');  -- G650  G650  4  
    

通配符@1:

通配符 描述
% 替代一个或多个字符
_ 仅替代一个字符
[charlist] 字符列中的任何单一字符
[^charlist]或者[!charlist] 不在字符列中的任何单一字

数学函数

  • 取绝对值:ABS(x)

    SELECT ABS(-1); --  1
    
  • 返回圆周率:PI()

    SELECT PI(); --3.141593
    
  • 返回0到1的伪随机数: RAND([seed])
    seed:种子值,传入相同的种子值会返回相同的结果。

    SELECT RAND(); --0.8503592115364589
    SELECT RAND(); --0.28463380767982
    SELECT RAND(100); -- 0.715436657367485 多试几次也一样
    
  • 返回大于或等于x的最小整数: CEILING(x)

    SELECT CEILING(-1.5)  -- -1
    SELECT CEILING(1.5);  -- 2
    
  • 返回小于或等于x的最大整数: FLOOR(x)

    SELECT FLOOR(1.5); 1
    SELECT FLOOR(-1.5); -2
    
  • 返回一个数值,舍入到指定的长度或精度: ROUND(n,len[,function])

    len:是n的舍入精度,如果len为整数,则n舍入到len指定的小数位数,如果len为负数,则n小数点左边舍入到len的指定位数

    SELECT ROUND(-123.45,-3); --  0.00
    SELECT ROUND(-123.45,-2); --  -100.00
    SELECT ROUND(-123.45,-1); -- -120.00
    SELECT ROUND(-123.45,0);  -- -123.00
    SELECT ROUND(-123.45,1);  -- -123.50
    SELECT ROUND(-123.45,2);  -- -123.45
    SELECT ROUND(-123.45,3);  -- -123.45
    
    
  • 返回指定浮点值的平方: SQUARE(f)

    SELECT SQUARE(2.5); -- 6.25
    
    
  • 返回指定浮点值的平方根: SQRT(f)

    SELECT SQRT(100.00);  -- 10.00    
    
  • 返回指定表达式的正号 (+1)、零 (0) 或负号 (-1): SIGN(n)

    SELECT SIGN(100.00);  -- 1
    SELECT SIGN(0);  -- 0
    SELECT SIGN(-100.00);  -- -1
    
  • 返回指定表达式的指定幂的值: POWER(n)

    SELECT POWER(2.0, 3);  --8.0
    

聚合函数

...同mysql的AVG()\COUNT()\SUM()\MIN()\MAX()\HAVING

  • 返回一个表达式的平均值,expression 是一个字段: AVG(expression)

    SELECT AVG(FSL) FROM table-- 取table表FSL字段的平均值
    
    
  • ..........

  • 返回查询的总记录数,返回类型为BigInt,expression 是一个字段或* COUNT_BIG()

转换函数

CAST ( expression AS data_type [ ( length ) ] )

CONVERT ( data_type [ ( length ) ] , expression [ , style ] )

    SELECT CAST(GETDATE() as varchar(29));  -- 04 16 2019  4:09PM
    SELECT CONVERT(varchar(29),GETDATE(),0); -- 04 16 2019  4:05PM
    SELECT CONVERT(varchar(29),GETDATE(),101); --04/16/2019

    SELECT CAST('12.5' AS decimal(9,2)); --12.50
    SELECT CONVERT( decimal(9,2),'12.50'); --12.50
data_type ID Style 格式
100 或者 0 mon dd yyyy hh:miAM (或者 PM)
101 mm/dd/yy
102 yy.mm.dd
103 dd/mm/yy
104 dd.mm.yy
105 dd-mm-yy
106 dd mon yy
107 Mon dd, yy
108 hh:mm:ss
109 或者 9 mon dd yyyy hh:mi:ss:mmmAM(或者 PM)
110 mm-dd-yy
111 yy/mm/dd
112 yymmdd
113 或者 13 dd mon yyyy hh:mm:ss:mmm(24h)
114 hh:mi:ss:mmm(24h)
120 或者 20 yyyy-mm-dd hh:mi:ss(24h)
121 或者 21 yyyy-mm-dd hh:mi:ss.mmm(24h)
126 yyyy-mm-ddThh:mm:ss.mmm(没有空格)
130 dd mon yyyy hh:mi:ss:mmmAM
131 dd/mm/yy hh:mi:ss:mmmAM

排序函数

  • row_number()
  1. 按照over()子句里面的order by进行排序

sql>SELECT ROW_NUMBER() over(order by TIME) as row_id,* from card

row_id RId NAME GROUP TIME
1 1325 A 1
2 1326 C 1
3 1327 Z 2
4 1328 B 2
5 1329 G 1
6 1330 X 1
7 1331 K 2
8 1332 J 3
9 1333 A 2

ps:over里头的分组及排序的执行晚于“where,group by,order by”的执行。

sql>SELECT ROW_NUMBER() over(order by TIME),* from card order by CName

row_id RId NAME GROUP TIME
1 1325 A 1
9 1333 A 2
4 1328 B 2
2 1326 C 1
5 1329 G 1
8 1332 J 3
7 1331 K 2
6 1330 X 1
3 1327 Z 2
  1. 使用row_number()函数进行统计

根据partition by 来进行分组,每个组的row_id都会重新计数,能直观的看出每个组有多少条记录。

sql>SELECT ROW_NUMBER() over(partition by GROUP order by TIME),* from card

row_id RId NAME GROUP TIME
1 1325 A 1
2 1326 C 1
3 1329 G 1
4 1330 X 1
1 1327 Z 2
2 1328 B 2
3 1331 K 2
4 1333 A 2
1 1332 J 3
  • RANK()

排名函数,比如一门课程有2个人成绩相同,并列第一,那么其他人的名次就要从3开始计算

sql>SELECT RANK() OVER(order by GRADE desc),* from card

Rank_id RID NAME GRADE TIME
1 1325 A 98
1 1326 C 98
1 1327 Z 98
4 1328 B 60
4 1329 G 60
6 1330 X 50
7 1331 K 40
7 1332 J 40
9 1333 W 2

(前三名并列第一,四五名并列第四,依次下推...)

  • Dense_Rank()

dense_rank函数的功能与rank函数类似,dense_rank函数是连续的。也就是说,当遇到相同排名时,将紧接着下一次的排名值增加。

sql>SELECT Dense_RANK() OVER(order by Operate desc),* from card

Rank_id RID NAME GRADE TIME
1 1325 A 98
1 1326 C 98
1 1327 Z 98
2 1328 B 60
2 1329 G 60
3 1330 X 50
4 1331 K 40
4 1332 J 40
5 1333 W 2

(Rank_id连续增长)

  • Ntile()

将结果集尽可能分到n组之内,

sql>SELECT NTILE(4) OVER(order by GRADE desc),* from card

Rank_id RID NAME GRADE TIME
1 1325 A 98
1 1326 C 98
1 1327 Z 98
2 1328 B 60
2 1329 G 60
3 1331 K 40
3 1332 J 40
4 1333 A 10
4 1330 X 10

(把结果(9条记录)分成4组,第一组3条,其它3组两天;3+2+2+2=9)

【分组约定】
1、每组的记录数不能大于它上一组的记录数,即编号小的组放的记录数不能小于编号大的组。也就是说,第1组中的记录数只能大于等于第2组及以后各组中的记录数。

​ 2、所有组中的记录数要么都相同,要么从某一个记录较少的组(命名为X)开始后面所有组的记录数都与该组(X组)的记录数相同。也就是说,如果有个组,前三组的记录数都是9,而第四组的记录数是8,那么第五组和第六组的记录数也必须是8。

系统函数

  • 如果s1不为空的话,返回s1,;如果s1为空的话,就返回s2 ISNULL ( s1, s2)

    SELECT ISNULL(null,'hello'); -- hello
    SELECT ISNULL('world','hello'); -- world
    
    
  • 确定表达式是否为有效的数值类型。 ISNUMERIC(expression )

      SELECT ISNUMERIC('12a');  --0
      SELECT ISNUMERIC(123);  -- 1
      SELECT ISNUMERIC(132.3); -- 1
      SELECT ISNUMERIC('12'); -- 1
      SELECT ISNUMERIC(0);  -- 1
    
  • 创建 uniqueidentifier 类型的唯一值,返回类型为uniqueidentifier。 NEWID ( )

    SELECT NEWID() -- 9BA0EC6F-51B9-4FDD-BC02-6A4118A5A6BC
    
  • 返回工作站标识号。 工作站标识号是连接到 SQL Server 的客户端计算机上的应用程序的进程 ID (PID)。 HOST_ID ()

    SELECT HOST_ID(); --4480      
    
  • 返回工作站名 HOST_NAME ()

    SELECT HOST_NAME (); --F24832A
    
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,332评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,508评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,812评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,607评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,728评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,919评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,071评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,802评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,256评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,576评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,712评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,389评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,032评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,798评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,026评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,473评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,606评论 2 350

推荐阅读更多精彩内容

  • 字符串函数 在开发T-SQL时,经常会需要对字符串进行各种各样的操作,下面介绍常用的字符串函数。 1、获取字符的A...
    道素阅读 1,202评论 0 2
  • pyspark.sql模块 模块上下文 Spark SQL和DataFrames的重要类: pyspark.sql...
    mpro阅读 9,448评论 0 13
  • Hive函数 Hive函数 一、关系运算: 等值比较: = 语法:A=B操作类型:所有基本类型描述:如果表达式A与...
    依天立业阅读 825评论 0 8
  • 第一步: 将mongodb安装目录下的bin文件夹路径放入系统环境变量,或者直接在cmd中进入该目录,比如: 第二...
    夕午wuw阅读 2,415评论 0 0
  • “XX,我——恨——你——” “呜呜……呜呜呜……” 一个姑娘悲泣的声音划破夜空,惊醒了正在熟睡的夜。 我睡意朦胧...
    艳儿_8c47阅读 243评论 0 1