.Net FX 2.0 中文语言包 与 英文包 在 Sql Server 日期操作的 差异。[Conversion failed when converting datetime from character string.]
项目环境:
Sql Server 2005等版本
.Net Framework 2.0程序或网站
开发调试无错的项目在其他机器上部署的时候发生错误,出错信息如下:
中文:字符串向 datetime 转换时失败。
英文:Conversion failed when converting datetime from character string.
问题关键:
安装开发主机和部署主机环境分别为[.Net Framework 2.0]与[.Net Framework 2.0 + 中文语言包/其他语言包]
举例:
例如,在lqb_MyUser表中有User_addDate字段(Datetime类型)
其中包括一行数据,User_addDate字段值=2008-4-1 0:00:00.000
对比:
中文语言包
查询:Select User_addDate from lqb_MyUser
返回:2008-4-1 0:00:00.000
查询:Select Convert(varchar,User_addDate) from lqb_MyUser
返回:04 01 2008 00:00AM
查询:Select Convert(varchar,User_addDate,0) from lqb_MyUser
返回:04 01 2008 00:00AM
查询:Select Convert(varchar,User_addDate,1) from z_UserInfo
返回:04/01/08
英文原版
查询:Select User_addDate from lqb_MyUser
返回:2008-4-1 0:00:00.000
查询:Select Convert(varchar,User_addDate) from lqb_MyUser
返回:Apr 01 2008 00:00AM
查询:Select Convert(varchar,User_addDate,0) from lqb_MyUser
返回:Apr 01 2008 00:00AM
查询:Select Convert(varchar,User_addDate,1) from z_UserInfo
返回:04/01/08
也就是说,如果要用Substring()取时间字符串中的一部分,Convert(Type,Name) 和 Convert(Type,Name,0) 在只安装了.net fx 2.0和安装.net fx 2.0+中文语言包的机器上获得的子串不一致。
出错信息如下:
中文:字符串向 datetime 转换时失败。
英文:Conversion failed when converting datetime from character string.
解决办法就是,规范类型转化的操作,尽量不要省略参数或默认参数
以下列出 日期格式化参数详表
提供一些常用日期操作语句以供参考:
---求相差天数
select datediff(day,'2004-01-01',getdate())
--1.一个月第一天的
SELECT DATEADD(mm, DATEDIFF(mm,0,getdate()), 0)
--2.本周的星期一
SELECT DATEADD(wk, DATEDIFF(wk,0,getdate()), 0)
select dateadd(wk,datediff(wk,0,getdate()),6)
--3.一年的第一天
SELECT DATEADD(yy, DATEDIFF(yy,0,getdate()), 0)
--4.季度的第一天
SELECT DATEADD(qq, DATEDIFF(qq,0,getdate()), 0)
--5.当天的半夜
SELECT DATEADD(dd, DATEDIFF(dd,0,getdate()), 0)
--6.上个月的最后一天
SELECT dateadd(ms,-3,DATEADD(mm, DATEDIFF(mm,0,getdate()), 0))
--7.去年的最后一天
SELECT dateadd(ms,-3,DATEADD(yy, DATEDIFF(yy,0,getdate()), 0))
--8.本月的最后一天
SELECT dateadd(ms,-3,DATEADD(mm, DATEDIFF(m,0,getdate())+1, 0))
--9.本年的最后一天
SELECT dateadd(ms,-3,DATEADD(yy, DATEDIFF(yy,0,getdate())+1, 0))
--10.本月的第一个星期一
select DATEADD(wk,
DATEDIFF(wk,0,dateadd(dd,6-datepart(day,getdate()),getdate())), 0)
--查询本周注册人数
select count(*) from [user]
where datediff(week,create_day-1,getdate())=0
--上周注册人数
select count(*) from [user]
where datediff(week,create_day-1,getdate())=1
--本月注册人数
select count(*) from [user]
where datediff(month,create_day,getdate())=0
--上月注册人数
select count(*) from [user]
where datediff(month,create_day,getdate())=1
--如果要效率,这样写查询
--查询本周注册人数
select count(*) from [user]
where create_day>=dateadd(day,2-datepart(weekday,getdate()),convert(varchar,getdate(),112))
and create_day<dateadd(day,9-datepart(weekday,getdate()),convert(varchar,getdate(),112))
--上周注册人数
select count(*) from [user]
where create_day>=dateadd(day,-5-datepart(weekday,getdate()),convert(varchar,getdate(),112))
and create_day<dateadd(day,2-datepart(weekday,getdate()),convert(varchar,getdate(),112))
--本月注册人数
select count(*) from [user]
where create_day>=dateadd(day,1-day(getdate()),convert(varchar,getdate(),112))
and create_day<dateadd(month,1,dateadd(day,1-day(getdate()),convert(varchar,getdate(),112)))
--上月注册人数
select count(*) from [user]
where create_day>=dateadd(month,-1,dateadd(day,1-day(getdate()),convert(varchar,getdate(),112)))
and create_day<dateadd(day,1-day(getdate()),convert(varchar,getdate(),112))