由于项目业务的需要,业务大概意思是这样的:一个单位在发放员工奖金时,要统计导出报表,一种是按照归属时间导出,另一种是按照发放时间导出。比如: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 所表示的含义,在这里再补充罗嗦下.
通过使用科威特算法来支持阿拉伯样式的日期格式。
在下表中,左侧的两列表示将 datetime 或 smalldatetime 数据转换为字符数据的 style 值。将 style 值加 100,可获得包括世纪数位的四位年份 (yyyy)。
| 不带世纪数位 (yy) (1) |
带世纪数位 (yyyy) |
标准 |
输入/输出 (3) |
|
-
|
0 或 100 (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
|
|
-
|
9 或 109 (1, 2)
|
默认设置 + 毫秒
|
mon dd yyyy hh:mi:ss:mmmAM(或 PM)
|
|
10
|
110
|
美国
|
mm-dd-yy
|
|
11
|
111
|
日本
|
yy/mm/dd
|
|
12
|
112
|
ISO
|
yymmdd
|
|
-
|
13 或 113 (1, 2)
|
欧洲默认设置 + 毫秒
|
dd mon yyyy hh:mi:ss:mmm(24h)
|
|
14
|
114
|
-
|
hh:mi:ss:mmm(24h)
|
|
-
|
20 或 120 (2)
|
ODBC 规范
|
yyyy-mm-dd hh:mi:ss(24h)
|
|
-
|
21 或 121 (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 0 或 100、9 或 109、13 或 113、20 或 120 以及 21 或 121)始终返回世纪数位 (yyyy)。
3 转换为 datetime 时输入;转换为字符数据时输出。
4 为用于 XML 而设计。对于从 datetime 或 smalldatetime 到字符数据的转换,其输出格式如上一个表所述。
5 回历是有多种变体的日历系统。SQL Server 2005 使用科威特算法。
下次写篇关于Cast 和Convert 以及游标的文章,来好好的巩固下。欢迎大家提出建议。