SQL Server 内置函数

日期时间函数

--返回当前系统日期时间
select getdate() as [datetime],sysdatetime() as [datetime2]

getdate返回的是datetime类型的数据,而sysdatetime返回的是datetime2数据类型的数据。后者精度更高。

拆分显示日期和时间

select day(getdate()) as 日期,month(getdate()) as 月份,year(getdate()) as 年份

三个函数day,month,year返回的值是显示的。

select datename(d,getdate()) as 日期,datename(M,getdate()) as 月份,datename(YY,getdate()) as 年份,datename(weekday,getdate()) as 星期

datename函数返回nvarchar数据类型的字符串值。

select datepart(D,getdate()) as 日期,datepart(M,getdate()) as 月份,datepart(YYYY,getdate()) as 年份,datepart(weekday,getdate()) as 星期

datepart函数返回的是整型值。

DATEFROMPARTS标量值函数

2012新函数,用来从其他表达式中获取日期数据

select datefromparts(1972,5,26) as datefromparts, --日期
datetime2fromparts(1972,5,26,7,14,16,10,3) as datetime2fromparts,--毫秒精确3位
datetimefromparts(1972,5,26,7,14,16,10) as datetimefromparts,--同上
datetimeoffsetfromparts(1972,5,26,7,14,16,10,12,0,3) as datetimeoffsetfromparts,--带上午下午
smalldatetimefromparts(1972,5,26,7,14) as smalldatetimefromparts, --日期+时间
timefromparts(7,14,16,10,3) as timefromparts --时间

操作日期

select datediff(dd,getdate(),'2015/8/30') as 距离8月30日还有,--相减 得出天数
dateadd(dd,1,getdate()) as 当前日期加一天是, --加日期 得到新日期
eomonth(getdate()) as 指定月份最后一天, --SQL Server 2012新增
isdate('2015/9/33') as 验证是否有效日期 --正确1 错误0

转换函数

cast(数据 as 类型)

print '123' + 123 --结果246,因为sqlserver中以数字优先处理,若想输出字符串需要转换

print '123' + cast(123 as varchar)--输出123123

print cast('185.12485' as decimal(10,2)) --转换货币格式修改小数位 输出185.12

print cast('2015/1/1 19:00:00' as date) --输出2015-01-01

输出:

246
123123
185.12
2015-01-01

convert(类型,数据,[样式])

使用convert转换与cast转换的区别是,还可以指定一些样式,省去了程序.ToString("yyyy-MM-dd")等转换。

select convert(varchar,getdate()), --返回默认字符串
convert(varchar,getdate(),101), --美国 mm/dd/yyyy
convert(varchar,getdate(),103), --英国/法国 dd/mm/yy
convert(varchar,getdate(),104), --德国 dd.mm.yy
convert(varchar,getdate(),111) --日本 yy/mm/dd 非常遗憾 全亚洲都是用日本的...
--具体样式请查看联机丛书

SQL Server 2012中新的转换函数

Parse

--只有将字符串转换为数字或日期时间才可以使用
select parse('123' as int) --输出123
--select parse('s123' as int) --报错 必须可以转换为整型才可以
select parse('2016/10/01' as date) -- 2016-01-01

Try_Parse

--尝试转换 失败返回NULL
select Try_Parse('123' as int) --123
select Try_Parse('s123' as int) --NULL
--select Try_Parse(123 as varchar) --失败,只能转换字符串到整型

Try_Convert

--现有Convert进行扩展,失败则为null
select Try_Convert(datetime,'2015/6/1',111)
select Try_Convert(datetime,'2015/6/40',111) --NULL

Try_Cast

--现有cast进行扩展
select Try_Cast('2016/6/1' as date)
select Try_Cast('2016/6/34' as date)--NULL

以上带try前缀的 表示尝试进行转换,如果失败不会报错,而是返回NULL。

字符串函数

select concat('12' , 34 , '56') --2012新函数 将非字符串自动转换字符串
select rtrim('asd ') --去右侧空白
select ltrim(' asd') --去左侧空白
select left('abcedfg',3) --取左三位 abc
select right('abcedfg',3) --取右三位 dfg
select substring('abcdefg',3,5) --从第3位截取5个数字 cdefg
select len('abcdefg') --返回字符串长度
select '12' + cast(34 as varchar) + '56' --需要转换 否则按数字计算
select ascii('a'); --返回ascii值
select unicode('a'); --返回unicode值
select 'a' + space(2) + 'b'; --输出空格
select difference('hello', 'helloWorld'); --比较字符串相同个数
select replace('abcedef', 'e', 'E'); --替换字符串
select stuff('hello world', 3, 4, 'ABC'); --指定位置替换字符串
select replicate('abc#', 3); --输出重复字符串 几次
select reverse('sqlServer'); --反转字符串
select lower('aBc') --转换小写
select upper('aBc') --转换大写

逻辑函数

2012有两种新的逻辑函数,choose 和 iif。

choose

--根据一个指定的索引返回列表中的一个值
declare @choosevar int = 3
select choose(@choosevar,'one','two','baibai','three') as [choose]
--返回baibai

IIF

--根据布尔表达式计算true还是false,返回其中一个值
select iif(datename(month,getdate())='08','嗯 是8月','不是8月')
--类似三元运算符 如果成立 返回第一个参数 否则返回第二个

聚合函数

SUM求和

--必须是整数
select sum(age) from student
select sum(distinct age) from student--去重

AVG平均

select avg(age) from student
select avg(distinct age) from student--去重

COUNT统计

--统计
select count(*) from student --所有行数
select count(id) from student --所有个数
select count(distinct name) from student --去重的个数

MAX最大值

select max(id) from student

MIN最小值

select min(age) from student

分组聚合GROUP BY

select name,count(age) from student group by name
--注意:任何一个未被聚合函数所用到,但却出现在select语句的列名,必须包含在group by 子句中 --select id,name,avg(age) from student group by name --报错 因为没group by id
select name,avg(age) from student group by name

分组筛选HAVING

select name,avg(age) from student group by name having avg(age) > 25

开窗|分区函数OVER

select avg(age) from student; --只能返回一条平均年龄信息
select *,avg(age) over() as avgAge from student; --新开一个窗口显示平均成绩 select *,row_number() over(order by age desc) as [row_number] from student; --根据over子句的排序,生成新的自增整数 123456 select *,rank() over(order by age desc) as [rank] from student; --如果两行排名相同 则生成的值也一样,并且不连续 11 33 555 8 select *,dense_rank() over(order by age desc) as [dense_rank] from student; --同上,但是值会连续 11 2222 33

SQL Server临时对象

对于一些经常需要多表联查,分组聚合,一些查询复杂非常耗时间的脚本 可以临时存储在数据集中。

公用表表达式CTE

--公用表表达式CTE
--CTE是一个临时的结果集,不会存储在数据库中,且只在查询期间有效。
with cte(id,name,age) --定义cte
as
(
select id,name,age from student --可定义复杂的多表联查等
)
select* from cte where age > 24 --基于临时表的操作在此完成

表变量

--与本地变量类似,用@定义,一般用来存储少量数据。
declare @local_table as table --定义表变量
(
localId int,
localMoney money
)
insert into @local_table select id,age from student --将查询结果插入到表变量 select * from @local_table --查询表变量中的数据
--在整个批处理或会话期间都可以访问表变量,CTE则不可

临时表

--本地临时表,仅在当前会话期间有效,当会话结束后会被删除。前缀#
--全局临时表,可被所有会话引用,当创建临时表的会话与所有引用该临时表的会话都关闭后才会被删除。前缀##
create table #t --创建临时表
(
tId int,
tName varchar(20)
)
insert into #t select id,name from student select * from #t drop table #t --手动删除临时表

处理T-SQL错误

begin try
select 1/0 --不会报错 而是到catch块处理
end try
begin catch
print '错误了'
end catch --2012引入throw 抛出异常 返回更详细的错误信息
begin try
select 1/0 --不会报错 而是到catch块处理
end try
begin catch
throw
end catch --自定义错误提示
begin try
select 1/0 --不会报错 而是到catch块处理
end try
begin catch
throw 50000,'用1除以0了',1; --参1消息:50000-2147483647之间,参2消息,参3状态0-255之间
end catch

消息 8134,级别 16,状态 1,第 11 行
遇到以零作除数错误。

控制流关键字

begin end

成对使用,包含一组T-SQL语句,begin end可以嵌套 类似{}

begin
declare @beginDate date = '2015/8/16'
declare @endDate date = '2015/8/30'
print datediff(dd,@beginDate,@endDate)
end
--输出14

if else

--与c#一样 如果成立则, 否则
declare @beginDate date = '2015/8/16'
declare @endDate date = '2015/8/30'
declare @diff int = datediff(dd,@beginDate,@endDate)
if(@diff > 0)
begin
print '相差天数为' + cast(@diff as varchar)
end
else
begin
print '开始日期小于结束日期'
end
--输出相差天数为14

while

--循环,如果真一直循环,false则退出循环
declare @index int = 1
while(@index<10)
begin
set @index = @index + 1
if(@index < 5)
begin
continue --小于5继续循环
end
else
begin
break --否则终止循环
end
end
print @index --5

SQL Server 内置函数、临时对象、流程控制的更多相关文章

  1. 10、SQL Server 内置函数、临时对象、流程控制

    SQL Server 内置函数 日期时间函数 --返回当前系统日期时间 select getdate() as [datetime],sysdatetime() as [datetime2] getd ...

  2. sql server内置函数

    MSDN标准文档:https://msdn.microsoft.com/zh-cn/library/ff848784(v=sql.120).aspx 配置函数 select @@servername ...

  3. mysql 内置函数和sql server 内置函数的区别

    以下函数均没有对参数做说明,使用的使用需要了解其参数内容 数据库 sql server mysql oracle 举例 获得当前系统时间 getdate() now() sysdate  注意不是函数 ...

  4. 总结Sql Server内置函数实现MD5加密

    --MD5加密 --HashBytes ('加密方式', '待加密的值') --加密方式= MD2 | MD4 | MD5 | SHA | SHA1 --返回值类型:varbinary(maximum ...

  5. Sql Server内置函数实现MD5加密

    实例 MD5加密“123456”: HashBytes('MD5','123456') 结果:0xE10ADC3949BA59ABBE56E057F20F883E (提示:看完最后,结果要进行转换.) ...

  6. SQL Server 内置函数实现MD5加密

    一.MD5加密 HASHBYTES ('加密方式', '待加密的值')     加密方式= MD2 | MD4 | MD5 | SHA | SHA1     返回值类型:varbinary(maxim ...

  7. sql server内置存储过程、查看系统信息

    1.检索关键字:sql server内置存储过程,sql server查看系统信息 2.查看磁盘空间:EXEC master.dbo.xp_fixeddrives , --查看各个数据库所在磁盘情况S ...

  8. sql server 内置ETL工具学习(一) BCP篇

    sql server 内置ETL工具学习 常用的导入方式:bcp, BULK INSERT,OPENROWSET和 SSIS. BCP BCP全称BULK COPY PROGRAM 有以下特点: 命令 ...

  9. [SQL]SUTFF内置函数的用法 (删除指定长度的字符并在指定的起始点插入另一组字符)

    STUFF 删除指定长度的字符并在指定的起始点插入另一组字符. 语法 STUFF ( character_expression , start , length , character_express ...

随机推荐

  1. SIGPIPE了解

    当未连接成功相机网络,在socket请求中 if (_session->prepareSession("192.168.1.1") != ICH_SUCCEED)    // ...

  2. php curl 采集

    curl 采集五个步骤: 1.curl_init()初始化curl 2.curl_setopt()设置传输数据和参数 3.curl_exec()执行传输并获取返回数据 4.curl_errono()返 ...

  3. static修饰的静态内部类

    Java里面static一般用来修饰成员变量或函数.但有一种特殊用法是用static修饰内部类,普通类是不允许声明为静态的,只有内部类才可以.被static修饰的内部类可以直接作为一个普通类来使用,而 ...

  4. 【转】 linux编程之GDB调试

    GDB是一套字符界面的程序集,可以用它在linux上调试C和C++程序,它提供了以下的功能: 1 在程序中设置断点,当程序运行到断点处暂停 2 显示变量的值,可以打印或者监视某个变量,将某个变量的值显 ...

  5. nginx 启动、重启、关闭

    一.启动 cd usr/local/nginx/sbin./nginx 二.重启 更改配置重启nginx kill -HUP 主进程号或进程号文件路径或者使用cd /usr/local/nginx/s ...

  6. Sudoku 数独游戏

    #include<iostream> using namespace std; bool heng(int **sudo, int a, int b, int value) { bool ...

  7. web storage和cookie的区别

    Web Storage的概念和cookie相似,区别是它是为了更大容量存储设计的.Cookie的大小是受限的,并且每次你请求一个新的页面的时候Cookie都会被发送过去,这样无形中浪费了带宽,另外co ...

  8. mina-http之坑

    TCP是流式协议,不保证一次通信传输完整的包,当这种情况发生在mina-http时会产生严重的bug,图中红框部分只是将前后收到的数据拼在一起,但下面处理的还是最近收到的不完整的msg:此为大坑! 轻 ...

  9. 我需要在Web上完成一个图片上传的功能

    我需要在Web上完成一个图片上传的功能. 这个页面需要能从手机中选择图片上传. 首先,这个页面是从微信上面触发的,所以修改了微信的的入口地址,增加了身份识别号作为传参. 跳转到页面的时候,页面先检查身 ...

  10. 在Emacs 24.4中使用在线字典

    使用Emacs时经常需要查英语字典怎么办?切到浏览器查?太慢.我想到一个高效的解决方案,利用新发布的Emacs 24.4中的Web浏览器eww,在Emacs中集成一个在线字典,查询光标处的字,一键搞定 ...