前端时间,执行写好的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) //显示为
06 19 2014 11:00PM
这里需要注意:
当对datetime等时间类型的数据进行转换时,可以使用适当的长度的char或varchar数据类型获取需要的日期部分.
总结CONVERT的使用
时间: 2024-11-02 02:21:00