我的世界会奔跑!

To strive, to seek, to find and not to yield, for the dream, with braveheart.
posts - 16, comments - 9, trackbacks - 0, articles - 4
  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理
         由于项目业务的需要,业务大概意思是这样的:一个单位在发放员工奖金时,要统计导出报表,一种是按照归属时间导出,另一种是按照发放时间导出。比如:2006年的奖金有可能推迟到2007年发放,那么按照归属时间来看的话,导出的奖金要包含这笔奖金,属于2006年的,按照发放时间导出的奖金就不包含这笔奖金,因为它2007年发放的。大概意思就是这样吧。
      
        页面上只能选择年份。 表结构有发放时间SendTime这一字段,是以标准时间格式存放的。写sql语句时就必须先把SendTime 截取年份。
         我首先想到的是把SendTime类型转换为 字符型,然后截取:
                       select  substring( CAST(SendTime as  nvarchar(100)),0,4)
                        from   datatatable
                        where substring( CAST(SendTime as  nvarchar(100)),0,4)='2006'    发现没有获取到想要的东西,其实在用Cast 转换时出了问题 ,CAST(SendTime as  nvarchar(100)) 把2007-05-25 9:15  转换 05 25 2007  9:15AM格式,所以没有得到所期望的结果。
        只好转用 Convert 函数。
         select sendtime
         from  datatatable
         where   sendtime !=''  and  Convert(varchar(4),sendtime,121) ='2006'   这样就可以得到了所期望的结果了。
      要的注意的是:  Convert(varchar(10),sendtime,121)   后和SubString()函数结合截取会抱错,按道理是应该可以结合使用的,不知道问题在哪里。    所以     Convert(varchar(4),sendtime,121)成4个字节就ok了。
        其实这不是最好的解决办法,有个数据库自带函数 DATENAME(year, sendtime)是最简洁的写法了,不容易出错。
         SELECT sendtime
         from  datatatable
         where    sendtime !=''   and  DATENAME(year, sendtime) =2006   
       其实这个并没有什么难度,只所以写出来,是想对自身经验的总结吧,也供大家参考,避免走些弯路,浪费时间。
       关于Convert(varchar(4),sendtime,121) 中121  所表示的含义,在这里再补充罗嗦下.

       

        通过使用科威特算法来支持阿拉伯样式的日期格式。

 

在下表中,左侧的两列表示将 datetimesmalldatetime 数据转换为字符数据的 style 值。将 style 值加 100,可获得包括世纪数位的四位年份 (yyyy)。

不带世纪数位 (yy) (1) 带世纪数位 (yyyy) 标准 输入/输出 (3)

-

0100 (1, 2)

默认设置

mon dd yyyy hh:miAM(或 PM)

1

101

美国

mm/dd/yyyy

2

102

ANSI

yy.mm.dd

3

103

英国/法国

dd/mm/yy

4

104

德国

dd.mm.yy

5

105

意大利

dd-mm-yy

6

106 (1)

-

dd mon yy

7

107 (1)

-

mon dd, yy

8

108

-

hh:mi:ss

-

9109 (1, 2)

默认设置 + 毫秒

mon dd yyyy hh:mi:ss:mmmAM(或 PM)

10

110

美国

mm-dd-yy

11

111

日本

yy/mm/dd

12

112

ISO

yymmdd

-

13113 (1, 2)

欧洲默认设置 + 毫秒

dd mon yyyy hh:mi:ss:mmm(24h)

14

114

-

hh:mi:ss:mmm(24h)

-

20120 (2)

ODBC 规范

yyyy-mm-dd hh:mi:ss(24h)

-

21121 (2)

ODBC 规范(带毫秒)

yyyy-mm-dd hh:mi:ss.mmm(24h)

-

126 (4)

ISO8601

yyyy-mm-ddThh:mi:ss.mmm(无空格)

127(6, 7)

带时区 Z 的 ISO8601。

yyyy-mm-ddThh:mi:ss.mmmZ

(无空格)

-

130 (1, 2)

回历 (5)

dd mon yyyy hh:mi:ss:mmmAM

-

131 (2)

回历 (5)

dd/mm/yy hh:mi:ss:mmmAM

1 这些样式值将返回不确定的结果。包括所有 (yy)(不带世纪数位)样式和一部分 (yyyy)(带世纪数位)样式。

2 默认值(style 010091091311320120 以及 21121)始终返回世纪数位 (yyyy)。

3 转换为 datetime 时输入;转换为字符数据时输出。

4 为用于 XML 而设计。对于从 datetimesmalldatetime 到字符数据的转换,其输出格式如上一个表所述。

5 回历是有多种变体的日历系统。SQL Server 2005 使用科威特算法。

   下次写篇关于Cast 和Convert 以及游标的文章,来好好的巩固下。欢迎大家提出建议。