询结果中实际的日期表示相符的。使用样式参数的时候,请记住你所做的只会影响日期字符形式的表现方式而不会影响它的存储方式(当然,除非你使用非datetime数据类型列存储要表现的日期)。
表8-7中列出了CONVERT函数可用样式格式的一些示例。
表8-7 CONVERT样式格式
样式代码 101 102 103
格 式 mm/dd/yyyy yy.mm.dd dd/mm/yy
(续) 样式代码 108 110 112
例如
格 式 hh:mm:ss mm-dd-yy yymmdd
返回的当天日期格式为:
当诸如GETDATE()的函数执行并保存在datetime列的时候,日期和时间数据都会保存。然而,如果你仅仅希望保存日期级别的数据(没有具体时间),常用的技巧是使用CONVERT来消除样式为00:00:00.000的时间。
下面的示例转换日期值为字符值,然后重新把它转换为datetime数据类型:
这个查询返回:
解析
样式选项的101值告诉CONVERT来以mm/dd/yyyy格式返回日期。在把数据给呈现终端用户的时候,查询编写者通常会关心样式选项。当要把datetime或sm
alldatetime转换为字符数据类型的时候就要使用这种呈现方式。记住,如果你将日期类型转换回datetime并保存这种转换后的日期,根据你为字符数据选择的样式,可能会丢失原始小时、分钟、秒等的精度。
8.6.3 计算表达式是日期还是数字
当转换数据类型的时候,有时候知道SQL Server认为一个表达式是什么数据类型是很有用的。在这个技巧中,我会演示使用ISDATE和ISNUMERIC函数来检测表达式的数据类型:
返回1 返回0 返回1 返回0
解析
ISDATE检测表达式是否为有效的datetime值。ISNUMERIC检测表达式
是否为有效的数字数据类型值。如果表达式计算为TRUE,ISNUMERIC和ISDATE都返回1,如果为FALSE,则都返回0。
8.7 排名函数
排名函数是SQL Server 2005增加的一个非常受欢迎的特性,它允许我们在结果集中返回和每行关联的值。表8-8描述了4个新的排名函数。
表8-8 排名函数
函 数 ROW_NUMB
描 述
在结果集中为每行返回递增整数
ER RANK DENSE_RANK NTILE
和ROW_NUMBER相似,RANK为结果集中的每行递增值。主要的区别是如果行有重复值,它们会有相同的排名值
DENSE_RANK和RANK几乎一样,只是DENSE_RANK不在排名值中返回间隔
NTILE根据排序和可选的分区把结果集划分成指定数量的分组
下面4个技巧会演示这4个排名函数的使用。
8.7.1 使用递增行号
SQL Server 2005新的ROW_NUMBER在结果集中为每行返回递增的整数。ROW_NUMBER的语法如下:
第一个可选参数partition_by_clause允许你为分区列中的每个改变重置行号。第二个参数order_by_clause指定ROW_NUMBER应用到结果集的次序。
第一个示例返回结果集中间的6行,根据名字排序:
选择结果集中间从255到260的行
这个查询返回:
可选的partition_by_clause允许为分区列的每次修改重置行号。在这个示例中,结果根据Shelf来分区并且根据ProductID排序:
在返回的结果中,行号根据ProductID递增,但是每一次Shelf变化后,行号都会从1开始:
解析
在第一个示例中,我们使用ROW_NUMBER来根据产品名排列结果并且为每行增加递增值。在子查询的第三列中引用了ROW_NUMBER:
括号中的ORDER BY子句根据产品名对结果排序,它影响行返回的次序以及和每行关联的行号。结果集中的每一行都会有一个号码,每行都会加1。由于查询根据Name排列结果,第一个产品Adjustable Race的行号会是“1”。把这个查询作为子查询,这样ROW_NUMBER列就能在外部查询的WHERE子句中被引用,返回从255到260的行。
第二个查询演示了使用partition_by_clause参数。对于Shelf的每一次改变,行号都会从“1”开始。
有了SQL Server 2005的ROW_NUMBER函数,我们现在就可以不用像SQL Server 2000那样创建其他代码实现数据分页了(例如,显示25到50行)。
8.7.2 根据排名返回行
在这个技巧中,我会演示SQL Server 2005新的RANK函数,它和ROW_NUMBER相似,也为集合中的每一行增加值。RANK的语法如下:
主要的区别是如果行有相同的值存在,那么他们会获取相同的排名值,如本例演示的那样:
这个查询返回:
和ROW_NUMBER一样,OVER子句包含可选的partition_by_clause和必需的order_by_clause。order_ by_clause决定RANK值应用到每行的顺序,可选的partition_by_clause用于进一步划分排序分组,如下例:
这个查询根据销售人员的TerritoryID进行分区并返回SalesQuota的排名:
解析
RANK根据排序的列增加它的值,和ROWNUMBER的增加每行值不同,RANK会为排序值一致的行返回相同的值。
例如,在这个技巧中,查询指定了根据SalesQuota降序排序的RANK。由于两个SalesQuota值都等于280 000.00,它们都得到了排名7:
百度搜索“77cn”或“免费范文网”即可找到本站免费阅读全部范文。收藏本站方便下次阅读,免费范文网,提供经典小说综合文库SQL Server 2005范例代码查询辞典(7)在线全文阅读。
相关推荐: