[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 | 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()
- 按照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 |
- 使用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