问题描述:
.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.

解决办法就是,规范类型转化的操作,尽量不要省略参数或默认参数

以下列出 日期格式化参数详表

.Net FX 2.0 中文语言包 与 英文包 在 Sql Server 日期操作的 差异。[Conversion failed when converting datetime from character string.]Select CONVERT(varchar(100), GETDATE(), 0): 05 16 2006 10:57AM
.Net FX 2.0 中文语言包 与 英文包 在 Sql Server 日期操作的 差异。[Conversion failed when converting datetime from character string.]
Select CONVERT(varchar(100), GETDATE(), 1): 05/16/06
.Net FX 2.0 中文语言包 与 英文包 在 Sql Server 日期操作的 差异。[Conversion failed when converting datetime from character string.]
Select CONVERT(varchar(100), GETDATE(), 2): 06.05.16
.Net FX 2.0 中文语言包 与 英文包 在 Sql Server 日期操作的 差异。[Conversion failed when converting datetime from character string.]
Select CONVERT(varchar(100), GETDATE(), 3): 16/05/06
.Net FX 2.0 中文语言包 与 英文包 在 Sql Server 日期操作的 差异。[Conversion failed when converting datetime from character string.]
Select CONVERT(varchar(100), GETDATE(), 4): 16.05.06
.Net FX 2.0 中文语言包 与 英文包 在 Sql Server 日期操作的 差异。[Conversion failed when converting datetime from character string.]
Select CONVERT(varchar(100), GETDATE(), 5): 16-05-06
.Net FX 2.0 中文语言包 与 英文包 在 Sql Server 日期操作的 差异。[Conversion failed when converting datetime from character string.]
Select CONVERT(varchar(100), GETDATE(), 6): 16 05 06
.Net FX 2.0 中文语言包 与 英文包 在 Sql Server 日期操作的 差异。[Conversion failed when converting datetime from character string.]
Select CONVERT(varchar(100), GETDATE(), 7): 05 1606
.Net FX 2.0 中文语言包 与 英文包 在 Sql Server 日期操作的 差异。[Conversion failed when converting datetime from character string.]
Select CONVERT(varchar(100), GETDATE(), 8): 10:57:46
.Net FX 2.0 中文语言包 与 英文包 在 Sql Server 日期操作的 差异。[Conversion failed when converting datetime from character string.]
Select CONVERT(varchar(100), GETDATE(), 9): 05 16 2006 10:57:46:827AM
.Net FX 2.0 中文语言包 与 英文包 在 Sql Server 日期操作的 差异。[Conversion failed when converting datetime from character string.]
Select CONVERT(varchar(100), GETDATE(), 10): 05-16-06
.Net FX 2.0 中文语言包 与 英文包 在 Sql Server 日期操作的 差异。[Conversion failed when converting datetime from character string.]
Select CONVERT(varchar(100), GETDATE(), 11): 06/05/16
.Net FX 2.0 中文语言包 与 英文包 在 Sql Server 日期操作的 差异。[Conversion failed when converting datetime from character string.]
Select CONVERT(varchar(100), GETDATE(), 12): 060516
.Net FX 2.0 中文语言包 与 英文包 在 Sql Server 日期操作的 差异。[Conversion failed when converting datetime from character string.]
Select CONVERT(varchar(100), GETDATE(), 13): 16 05 2006 10:57:46:937
.Net FX 2.0 中文语言包 与 英文包 在 Sql Server 日期操作的 差异。[Conversion failed when converting datetime from character string.]
Select CONVERT(varchar(100), GETDATE(), 14): 10:57:46:967
.Net FX 2.0 中文语言包 与 英文包 在 Sql Server 日期操作的 差异。[Conversion failed when converting datetime from character string.]
Select CONVERT(varchar(100), GETDATE(), 20): 2006-05-16 10:57:47
.Net FX 2.0 中文语言包 与 英文包 在 Sql Server 日期操作的 差异。[Conversion failed when converting datetime from character string.]
Select CONVERT(varchar(100), GETDATE(), 21): 2006-05-16 10:57:47.157
.Net FX 2.0 中文语言包 与 英文包 在 Sql Server 日期操作的 差异。[Conversion failed when converting datetime from character string.]
Select CONVERT(varchar(100), GETDATE(), 22): 05/16/06 10:57:47 AM
.Net FX 2.0 中文语言包 与 英文包 在 Sql Server 日期操作的 差异。[Conversion failed when converting datetime from character string.]
Select CONVERT(varchar(100), GETDATE(), 23): 2006-05-16
.Net FX 2.0 中文语言包 与 英文包 在 Sql Server 日期操作的 差异。[Conversion failed when converting datetime from character string.]
Select CONVERT(varchar(100), GETDATE(), 24): 10:57:47
.Net FX 2.0 中文语言包 与 英文包 在 Sql Server 日期操作的 差异。[Conversion failed when converting datetime from character string.]
Select CONVERT(varchar(100), GETDATE(), 25): 2006-05-16 10:57:47.250
.Net FX 2.0 中文语言包 与 英文包 在 Sql Server 日期操作的 差异。[Conversion failed when converting datetime from character string.]
Select CONVERT(varchar(100), GETDATE(), 100): 05 16 2006 10:57AM
.Net FX 2.0 中文语言包 与 英文包 在 Sql Server 日期操作的 差异。[Conversion failed when converting datetime from character string.]
Select CONVERT(varchar(100), GETDATE(), 101): 05/16/2006
.Net FX 2.0 中文语言包 与 英文包 在 Sql Server 日期操作的 差异。[Conversion failed when converting datetime from character string.]
Select CONVERT(varchar(100), GETDATE(), 102): 2006.05.16
.Net FX 2.0 中文语言包 与 英文包 在 Sql Server 日期操作的 差异。[Conversion failed when converting datetime from character string.]
Select CONVERT(varchar(100), GETDATE(), 103): 16/05/2006
.Net FX 2.0 中文语言包 与 英文包 在 Sql Server 日期操作的 差异。[Conversion failed when converting datetime from character string.]
Select CONVERT(varchar(100), GETDATE(), 104): 16.05.2006
.Net FX 2.0 中文语言包 与 英文包 在 Sql Server 日期操作的 差异。[Conversion failed when converting datetime from character string.]
Select CONVERT(varchar(100), GETDATE(), 105): 16-05-2006
.Net FX 2.0 中文语言包 与 英文包 在 Sql Server 日期操作的 差异。[Conversion failed when converting datetime from character string.]
Select CONVERT(varchar(100), GETDATE(), 106): 16 05 2006
.Net FX 2.0 中文语言包 与 英文包 在 Sql Server 日期操作的 差异。[Conversion failed when converting datetime from character string.]
Select CONVERT(varchar(100), GETDATE(), 107): 05 162006
.Net FX 2.0 中文语言包 与 英文包 在 Sql Server 日期操作的 差异。[Conversion failed when converting datetime from character string.]
Select CONVERT(varchar(100), GETDATE(), 108): 10:57:49
.Net FX 2.0 中文语言包 与 英文包 在 Sql Server 日期操作的 差异。[Conversion failed when converting datetime from character string.]
Select CONVERT(varchar(100), GETDATE(), 109): 05 16 2006 10:57:49:437AM
.Net FX 2.0 中文语言包 与 英文包 在 Sql Server 日期操作的 差异。[Conversion failed when converting datetime from character string.]
Select CONVERT(varchar(100), GETDATE(), 110): 05-16-2006
.Net FX 2.0 中文语言包 与 英文包 在 Sql Server 日期操作的 差异。[Conversion failed when converting datetime from character string.]
Select CONVERT(varchar(100), GETDATE(), 111): 2006/05/16
.Net FX 2.0 中文语言包 与 英文包 在 Sql Server 日期操作的 差异。[Conversion failed when converting datetime from character string.]
Select CONVERT(varchar(100), GETDATE(), 112): 20060516
.Net FX 2.0 中文语言包 与 英文包 在 Sql Server 日期操作的 差异。[Conversion failed when converting datetime from character string.]
Select CONVERT(varchar(100), GETDATE(), 113): 16 05 2006 10:57:49:513
.Net FX 2.0 中文语言包 与 英文包 在 Sql Server 日期操作的 差异。[Conversion failed when converting datetime from character string.]
Select CONVERT(varchar(100), GETDATE(), 114): 10:57:49:547
.Net FX 2.0 中文语言包 与 英文包 在 Sql Server 日期操作的 差异。[Conversion failed when converting datetime from character string.]
Select CONVERT(varchar(100), GETDATE(), 120): 2006-05-16 10:57:49
.Net FX 2.0 中文语言包 与 英文包 在 Sql Server 日期操作的 差异。[Conversion failed when converting datetime from character string.]
Select CONVERT(varchar(100), GETDATE(), 121): 2006-05-16 10:57:49.700
.Net FX 2.0 中文语言包 与 英文包 在 Sql Server 日期操作的 差异。[Conversion failed when converting datetime from character string.]
Select CONVERT(varchar(100), GETDATE(), 126): 2006-05-16T10:57:49.827
.Net FX 2.0 中文语言包 与 英文包 在 Sql Server 日期操作的 差异。[Conversion failed when converting datetime from character string.]
Select CONVERT(varchar(100), GETDATE(), 130): 18 ???? ?????? 1427 10:57:49:907AM
.Net FX 2.0 中文语言包 与 英文包 在 Sql Server 日期操作的 差异。[Conversion failed when converting datetime from character string.]
Select CONVERT(varchar(100), GETDATE(), 131): 18/04/1427 10:57:49:920AM
.Net FX 2.0 中文语言包 与 英文包 在 Sql Server 日期操作的 差异。[Conversion failed when converting datetime from character string.]
.Net FX 2.0 中文语言包 与 英文包 在 Sql Server 日期操作的 差异。[Conversion failed when converting datetime from character string.]
.Net FX 2.0 中文语言包 与 英文包 在 Sql Server 日期操作的 差异。[Conversion failed when converting datetime from character string.]常用:
.Net FX 2.0 中文语言包 与 英文包 在 Sql Server 日期操作的 差异。[Conversion failed when converting datetime from character string.]
Select CONVERT(varchar(100), GETDATE(), 8): 10:57:46
.Net FX 2.0 中文语言包 与 英文包 在 Sql Server 日期操作的 差异。[Conversion failed when converting datetime from character string.]
Select CONVERT(varchar(100), GETDATE(), 24): 10:57:47
.Net FX 2.0 中文语言包 与 英文包 在 Sql Server 日期操作的 差异。[Conversion failed when converting datetime from character string.]
Select CONVERT(varchar(100), GETDATE(), 108): 10:57:49
.Net FX 2.0 中文语言包 与 英文包 在 Sql Server 日期操作的 差异。[Conversion failed when converting datetime from character string.]
Select CONVERT(varchar(100), GETDATE(), 12): 060516
.Net FX 2.0 中文语言包 与 英文包 在 Sql Server 日期操作的 差异。[Conversion failed when converting datetime from character string.]
Select CONVERT(varchar(100), GETDATE(), 23): 2006-05-16



提供一些常用日期操作语句以供参考:



---求相差天数
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())+10))

--9.本年的最后一天
SELECT dateadd(ms,-3,DATEADD(yy, DATEDIFF(yy,0,getdate())+10))

--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))

 

相关文章:

  • 2021-07-22
  • 2021-12-18
  • 2022-01-20
  • 2021-10-29
  • 2019-12-14
  • 2021-11-24
  • 2021-12-28
  • 2022-02-06
猜你喜欢
  • 2021-09-22
  • 2021-05-26
  • 2022-01-25
  • 2022-12-23
  • 2021-12-18
  • 2021-09-16
相关资源
相似解决方案