首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > SQL Server >

从字符串向 datetime 转换时失败解决方案

2013-12-04 
从字符串向 datetime 转换时失败我在执行存储过程的时候提示了这段话、-- exec proc_hj_rpt_item_dept_dsao

从字符串向 datetime 转换时失败
我在执行存储过程的时候  提示了这段话、

-- exec proc_hj_rpt_item_dept_dsaout 'convert(varchar(10),a.date_out,120) >= ''2013-01-12'' and convert(varchar(10),a.date_out,120) <= ''2013-11-13'' '
alter PROC [dbo].[proc_hj_rpt_item_dept_dsaout] (@var_parm VARCHAR(2000))
AS
DECLARE @var_sql1 VARCHAR(max),@var_sql2 VARCHAR(max),@var_sql3 VARCHAR(max),@var_sql4 VARCHAR(max),@var_group VARCHAR(200) ,
@var_parm1 VARCHAR(max),@var_parm2 VARCHAR(max),
@var_parm3 VARCHAR(max),@var_group1 VARCHAR(200),@date_lyearbegin DATETIME,
@date_lyearend DATETIME,@date_lmonthbegin DATETIME,@date_lmonthend DATETIME

--参数解析


--同期的时间

SET @date_lyearbegin = DATEADD(year,-1,CAST (SUBSTRING(@var_parm,charindex('a.date_out,120) >= ',@var_parm)+22,10) AS DATETIME))
SET @date_lyearend = DATEADD(year,-1,CAST (SUBSTRING(@var_parm,charindex('a.date_out,120) <= ',@var_parm)+22,10) AS DATETIME))

--环比的时间
SET @date_lmonthbegin = DATEADD(month,-1,CAST (SUBSTRING(@var_parm,charindex('a.date_out,120) >= ',@var_parm)+21,10) AS DATETIME))
SET @date_lmonthend = DATEADD(month,-1,CAST (SUBSTRING(@var_parm,charindex('a.date_out,120) <= ',@var_parm)+21,10) AS DATETIME))

--同期的参数
SET @var_parm2 =SUBSTRING(@var_parm,0,charindex('a.date_out,120) >= ',@var_parm)+21) +convert(varchar(10),@date_lyearbegin,120)+''' '
+ SUBSTRING(@var_parm,charindex('a.date_out,120) >= ',@var_parm)+33,LEN(' and convert(varchar(10),a.date_out,120) <= ')+1) +convert(varchar(10),@date_lyearend,120) + ''' ' + SUBSTRING(@var_parm,charindex('a.date_out,120) <= ',@var_parm)+33,999)

--环比的参数
SET @var_parm3 =SUBSTRING(@var_parm,0,charindex('a.date_out,120) >= ',@var_parm)+21) +convert(varchar(10),@date_lmonthbegin,120) +''' '
+ SUBSTRING(@var_parm,charindex('a.date_out,120) >= ',@var_parm)+33,LEN(' and convert(varchar(10),a.date_out,120) <= ')+1) +convert(varchar(10),@date_lmonthend,120) + ''' ' + SUBSTRING(@var_parm,charindex('a.date_out,120) <= ',@var_parm)+33,999)



PRINT @var_parm2

--SET @var_group= 'c.id_cate3,c.name_cate3'




SET @var_sql1=' Sselect a.id_item,b.name_item,a.id_dept,c.name_dept,sum(a.dec_qty)dec_qty 
INTO #Temp1
from dsaout_03 a,ctlm1020 b,ctlm1003 c
where 1=1 and  '+@var_parm+'
and a.id_item =b.id_item
and a.id_dept =c.id_dept
group by a.id_item,b.name_item,a.id_dept,c.name_dept
'


SET @var_sql2=' Sselect a.id_item,b.name_item,a.id_dept,c.name_dept,sum(a.dec_qty)dec_qty 
INTO #Temp2
from dsaout_03 a,ctlm1020 b,ctlm1003 c
where 1=1 and  '+@var_parm2+'
and a.id_item =b.id_item
and a.id_dept =c.id_dept
group by a.id_item,b.name_item,a.id_dept,c.name_dept
'

SET @var_sql3=' Sselect a.id_item,b.name_item,a.id_dept,c.name_dept,sum(a.dec_qty)dec_qty 
INTO #Temp3
from dsaout_03 a,ctlm1020 b,ctlm1003 c
where 1=1 and  '+@var_parm3+'
and a.id_item =b.id_item
and a.id_dept =c.id_dept
group by a.id_item,b.name_item,a.id_dept,c.name_dept
'
 
 
set @var_sql4 =' select  a.id_item,a.name_item,a.id_dept,a.name_dept,isnull(a.dec_qty,0)dec_qty,isnull(b.dec_qty,0)dec_qty2,c.dec_qty dec_qty3
FROM  #temp1 a 
LEFT JOIN  #Temp2 b ON a.id_item =b.id_item  AND a.id_dept= b.id_dept
LEFT JOIN  #Temp3 c ON a.id_item =c.id_item  AND a.id_dept= c.id_dept

order by a.id_item;
DROP TABLE #temp1
DROP TABLE #temp2
DROP TABLE #temp3
  '

PRINT @var_sql1
PRINT @var_sql2

PRINT @var_sql4
EXEC (@var_sql1+@var_sql2+@var_sql3+@var_sql4)


大神给看下
[解决办法]
从字符串向datetime转化失败,

意思很明显了,你转化时,有不符合datetime格式的字符串
[解决办法]
比如 你的字符串 SUBSTRING(@var_parm,charindex。。。,
你输出下,看看是否正确
------解决方案--------------------


看红色的部分,上面是22,下面是21,会不会是这个问题呢

--同期的时间

SET @date_lyearbegin = DATEADD(year,-1,CAST (SUBSTRING(@var_parm,charindex('a.date_out,120) >= ',@var_parm)+22,10) AS DATETIME))
SET @date_lyearend = DATEADD(year,-1,CAST (SUBSTRING(@var_parm,charindex('a.date_out,120) <= ',@var_parm)+22,10) AS DATETIME))

--环比的时间
SET @date_lmonthbegin = DATEADD(month,-1,CAST (SUBSTRING(@var_parm,charindex('a.date_out,120) >= ',@var_parm)+21,10) AS DATETIME))
SET @date_lmonthend = DATEADD(month,-1,CAST (SUBSTRING(@var_parm,charindex('a.date_out,120) <= ',@var_parm)+21,10) AS DATETIME))

[解决办法]

引用:
Quote: 引用:

看红色的部分,上面是22,下面是21,会不会是这个问题呢

--同期的时间

SET @date_lyearbegin = DATEADD(year,-1,CAST (SUBSTRING(@var_parm,charindex('a.date_out,120) >= ',@var_parm)+22,10) AS DATETIME))
SET @date_lyearend = DATEADD(year,-1,CAST (SUBSTRING(@var_parm,charindex('a.date_out,120) <= ',@var_parm)+22,10) AS DATETIME))

--环比的时间
SET @date_lmonthbegin = DATEADD(month,-1,CAST (SUBSTRING(@var_parm,charindex('a.date_out,120) >= ',@var_parm)+21,10) AS DATETIME))
SET @date_lmonthend = DATEADD(month,-1,CAST (SUBSTRING(@var_parm,charindex('a.date_out,120) <= ',@var_parm)+21,10) AS DATETIME))


不好意思 我发错代码了  我的代码 写的都是 21   我以为是数错位了 改了 22  但是都改为21 也出现了错误 正确的应该是 21  我想取到时间
谢谢大婶 观察仔细!


哦,呵呵,能把存储过程的 参数贴出来看看不?

热点排行