SQL SERVER函数大全 下载本文

DATEPART()与DATENAME()函数

这两个函数用于返回datetime或者shortdatetime值的日期部分。DATEPART()函数返回一个整型值;DATENAME()函数返回一个包含描述性文字的字符串。比如,将日期4-29-1988传递给DATEPART()函数,如指定返回月份值,则返回数字4:

SELECT DATEPART(MONTH, '4-29-1988')

而使用相同的参数,DATENAME()函数返回04(这取决于你的机器的本地语言,如果是英文版,那么将返回April):

SELECT DATENAME(MONTH, '4-29-1988')

这两个函数都接收和DATEADD()函数一样的时间间隔参数常量。 GETDATE()与GETUTCDATE()函数

这两个函数都用于返回datetime类型的当前日期与时间。GETUTCDATE()函数使用服务器上的时区设置来求出UTC时间,这和格林威治标准时间或飞行员所说的\祖鲁时\是一样的。两个函数都能精确到3.33毫秒。 SELECT GETDATE() SELECT GETUTCDATE()

执行这两个函数,都将返回未经格式化的结果,见下图:

我在北京,和UTC时间相差8个小时,和标准时间相差9个小时。可以使用如下DATEDIFF()函数来验证这个时间差值:

SELECT DATEDIFF(HOUR, GETDATE(), GETUTCDATE()) SYSDATETIME()和SYSUTCDATETIME()函数

这两个SQL Server 2008函数等价于GETDATE()和GETUTCDATE()函数,但不是返回datetime数据类型的结果,而是返回SQL Server 2008新的datetime2数据类型的结果,该数据类型可以精确到100纳秒,当然这取决于服务器安装的硬件。

SELECT SYSDATETIME() SELECT SYSUTCDATETIME()

DAY()、MONTH()和YEAR()函数

这三个函数分别返回以整数表示的datetime或者smalldatetime类型值的日、月、年。它们的用途很广泛,如可以创建独特的个性化日期格式。假设需要创建一个自定义的日期值作为字符串,通过将这三个函数的输出结果转换成字符类型,然后进行连接操作,就可以对输出结果以任何形式进行组合了:

SELECT 'Year: ' + CONVERT(varchar(4), YEAR(GETDATE())) + ', Month: ' + CONVERT(varchar(2), MONTH(GETDATE())) + ', Day: ' + CONVERT(varchar(2), DAY(GETDATE()))

这个脚本生成下列结果:

Year:2008, Month:2, Day:20

下一节将讨论字符串操纵函数,并使用相似的技术来构建一个紧凑的定制时间戳。 字符串操纵函数

字符串函数可以解析、替换、操纵字符型值。在处理原始字符数据时,最大的挑战之一是如何可靠地提取出有意义的信息。有很多字符串解析函数可用于标识和解析子字符串(一个大字符型值的一部分)。我们一直在做这种事,在我们阅读文件、发票或者书面材料时,就会本能地标识、分离出有意义的信息片段。这个过程的自动化非常困难,即使是处理不太复杂的文本,也很困难。这些函数包含几乎所有必需的工具,而挑战在于如何找出最简单、最高效的方法。 ASCII()、CHAR()、UNICODE()和NCHAR()函数

这四个函数是相似的,它们都可以在字符和字符的标准数字表示之间转换。美国标准信息交换码(American Standard Code for Information Interchange,ASCII)标准字符集包含128个字母、数字和标点符号。这个字符集是IBM PC体系结构的基础,虽然有些字符现在看来已经很古老了,但还是被保留了下来,且仍是现代计算机技术的核心。如果在计算机上使用英语,则键盘上的每个字符都是用ASCII码表示的。这对说英语(至少以英语打字)的计算机用户来说是有利的,但是其他人又该怎么办呢?

在计算机的发展过程中, ASCII字符集发布没多长时间便过时了。人们很快将它扩展成为256个字符的ANSI字符集,一个字符用一个字节来保存。这个扩展的字符列表满足了许多其他用户的需求,可以支持主要的欧洲语言字符,不过仍是美国标准(由美国国家标准学会持有),仍建立在最初的英语字符集的基础上。为了支持所有可印刷的语言,人们制订了Unicode标准,它支持多种语言特定的字符集。每个Unicode字符需要2个字节的存储空间,是ASCII与ANSI

字符的两倍。但是使用2个字就可以表示超过65 000个不同的字符,完全能够支持东欧和亚洲字符。SQL Server同时支持ASCII与Unicode两种标准。

ASCII()和CHAR()是两个基于ASCII的函数,这两个函数可将计算机上应用的每个字符表示为数字。要确定代表一个字符的数字是什么,就应给ASCII()函数传送只包含一个字符的字符串,如下:

SELECT ASCII('A') 结果是65。

如要将一个已知数字转换为字符,又该怎么办?使用CHAR()函数即可: SELECT CHAR(65) 结果是字母A。

要得到完整的ASCII字符值列表,可以对一个临时表填充从0到127的数字,然后调用CHAR()函数返回相应的字符。为了节省空间,我们对以下这个脚本进行了删节,但包含整个结果集,并以多栏格式给出。

-- 创建一个临时表来保存ASCII码: Create Table #ASCIIVals (ASCIIValue smallint) -- 插入数字0 - 127 到临时表中: declare @Number int set @Number = 0 while(@Number < 128) begin Insert Into #ASCIIVals (ASCIIValue) Select @Number set @Number = @Number + 1 end -- 查询所有的整型数字与其对应的ASCII码: SELECT ASCIIValue, CHAR(ASCIIValue) AS Character FROM #ASCIIVals drop table #ASCIIVals

表6-12是以多栏网格重新格式化的结果集。需要注意的是这里将不可印刷的控制字符以方括号表示。由于许多因素限制,如所安装的字体或语言不同,下表的显示可能会有稍许差异。

UNICODE()函数是ASCII()的Unicode等价函数,NCHAR()函数和CHAR()函数的功能相同,只不过NCHAR()是用于Unicode字符的。SQL Server的nchar与nvarchar类型能存储任何Unicode字符,可以和这两个函数一起使用。对于特别大的值,ntext类型和nvarchar(max)类型也支持Unicode字符。

要返回扩展字符编码集中的字符,可以将字符编码传递给NCHAR()函数: SELECT NCHAR(220) 返回字母ü。

SELECT NCHAR(233) 返回带重音符号的小写e:é。 SELECT NCHAR(241)

返回西班牙语的\,或者带有发音符号的n:

当然,ASCII标准也支持所有的欧洲字符,所以使用CHAR()函数也可以返回这些扩展字符。如果对256~65536之间的值使用CHAR()函数,返回值就很有趣了。例如,下面的查询返回希腊字符Ω:

SELECT NCHAR(433)

下面的查询返回西里尔字母Ya(Я)。 SELECT NCHAR(1071)

CHARINDEX()和PATINDEX()函数

CHARINDEX()是原始的SQL函数,用于寻找在一个字符串中某子字符串第一次出现的位置。如函数名所示,这个函数返回一个整型值,表示某子字符串的第一个字符在整个字符串中的位置索引。以下脚本用于在字符串Washington中寻找子字符串sh的出现位置:

SELECT CHARINDEX('sh', 'Washington')

返回的结果是3,表明s是字符串Washington中的第3个字符。这说明CHARINDEX函数匹配字符的索引是从1开始的。如果没有匹配到任何结果,函数将返回0。在这个例子中使用两个字符作为子字符串并没有特别意义,但是如果字符串包含多个s字符,就有意义了。

PATINDEX()函数和CHARINDEXO函数类似,它执行相同的操作,但方法稍许不同,该函数增加了对通配符(即Like运算符中使用的字符)的支持。顾名思义,它将返回一个字符模式