前端时间,执行写好的SQL时,出现了"从char数据类型到datetime数据类型的转换导致datetime值越界"。经过自己的折腾,发现数据表中的WarningTime为NULL,所以这里的转化就出现了问题,同时在此测试了一下不为datetime的char类型的数据进行CONVERT时,也会报错。所以:当使用CONVERT对日期类型的数据进行转换为B类型,除了注意B类型的数据具备日期类型数据的特性外,也要考虑到NULL的情况,这里的B指的是其他格式类型.
出现问题的代码:
select left(convert(varchar(10),WarnigTime,120),7) as YearMonth,
MaintenanceArea,
Company,
sum(WaN) as NewAddNum
from
( select CONVERT(varchar(50),WarnigTime,23)as WarnigTime ,
MaintenanceArea,
Company,SUM(case when WarningID<>0 then 1 else 0 end) as WaN
from dbo.t_xdz_warning Wa,dbo.t_xdz_station St
where Wa.StationID=St.ID
group by MaintenanceArea,Company,WarnigTime )as t
group by left(convert(varchar(10),WarnigTime,120),7),MaintenanceArea,Company
order by YearMonth desc
注:这里使用了LEFT函数:
LEFT(<character_expression>,<integer_expression>)
----返回character的左边的前integer长度的字符
----那么,对应的可以知道有RIGHT函数
RIGHT(<character_expression>,<integer_expression>)
--返回character的右边的后integer长度的字符
在此借这个机会总结一下CONVERT的使用.
CONVERT()函数是把日期类型转化为新数据类型的通用函数.
使用:
CONVERT(data_type(length),data_to_be_converted,style)
这里可以使用的style的值
StyleID Style 格式
100 或者0 mon dd yyyy hh:miAM (或者 PM)
101 mm/dd/yy
102 yy.mm.dd
103 dd/mm/yy
104 dd.mm.yy
105 dd-mm-yy
106 dd mon yy
107 Mon dd, yy
108 hh:mm:ss
109 或者 9 mon dd yyyy hh:mi:ss:mmmAM(或者 PM)
110 mm-dd-yy
111 yy/mm/dd
112 yymmdd
113 或者 13 dd mon yyyy hh:mm:ss:mmm(24h)
114 hh:mi:ss:mmm(24h)
120 或者 20 yyyy-mm-dd hh:mi:ss(24h)
121 或者 21 yyyy-mm-dd hh:mi:ss.mmm(24h)
126 yyyy-mm-ddThh:mm:ss.mmm(没有空格)
130 dd mon yyyy hh:mi:ss:mmmAM
131 dd/mm/yy hh:mi:ss:mmmAM
使用举例:(把当前日期转换为不同的格式)
CONVERT(varchar(24),GETDATE(),100)
//显示为
这里需要注意:
当对datetime等时间类型的数据进行转换时,可以使用适当的长度的char或varchar数据类型获取需要的日期部分.
原文地址:http://www.cnblogs.com/cdzTec/p/3798358.html