首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Server 2008 R2 :从字符串转换日期和/或时间时转换失败

Server 2008 R2 :从字符串转换日期和/或时间时转换失败
EN

Stack Overflow用户
提问于 2019-10-19 03:05:31
回答 2查看 43关注 0票数 0

我得到了以下错误

从字符串转换日期和/或时间时,

转换失败

我无法让它正常运行,请帮助我,这是我的代码(不要羞辱我的循环,我只是需要它来工作)。

问题是,我有一个包含契约it的封闭列表和一个具有不同日期和日期的表,名为#PERIODO,它包含datetime类型。

代码语言:javascript
复制
WHILE (SELECT TOP 1 FECHA1 FROM #PERIODO) > 0 
BEGIN
    SET @MES_ANTERIOR   = (SELECT TOP 1 FECHA1 FROM #PERIODO ORDER BY FECHA1 ASC)
    SET @MES_EN_CURSO   = (SELECT TOP 1 B.FECHA1 FROM (SELECT TOP 2 A.FECHA1 FROM #PERIODO A ORDER BY FECHA1 ASC ) B ORDER BY B.FECHA1 DESC)
    SET @MES_3          = (SELECT TOP 1 FECHA3 FROM #PERIODO ORDER BY FECHA1 ASC)
    SET @MES_4          = (SELECT TOP 1 B.FECHA3 FROM (SELECT TOP 2 A.FECHA3 FROM #PERIODO A ORDER BY FECHA3 ASC ) B ORDER BY B.FECHA3 DESC)
    SET @MES_ANT        = LEFT(CONVERT(VARCHAR(8),@MES_ANTERIOR,112),8) -- SELECT @MES_ANT
    SET @MES_CURR       = LEFT(CONVERT(VARCHAR(8),@MES_EN_CURSO,112),8) -- SELECT @MES_CURR  

     EXEC('IF OBJECT_ID(''WORK.DBO.OPERACIONES_ABIF_'+@MES_CURR+''', ''U'') IS NOT NULL 
            DROP TABLE WORK.DBO.OPERACIONES_ABIF_'+@MES_CURR+'    ')  

     SET @SQL1 = 'SELECT DISTINCT 
         A.* 
         INTO  WORK.DBO.OPERACIONES_ABIF_'+@MES_CURR+'
         FROM  BDGESTION.DBO.BASE_RIESGOS_PROD_ALTAIR_'+@MES_CURR+' A   WHERE '

     SET @SQL2 = ' A.NUM_OPERACION IN ( 
                 SELECT 
                    B.NUM_CONTRATO 
                    FROM (
                        SELECT NUM_CONTRATO 
                        FROM 
                            ( SELECT * FROM #OPER WHERE FECHA_INICIO IS NOT NULL) H 
                        WHERE       H.FECHA_INICIO <  CAST(CONVERT(VARCHAR(12),'+@MES_EN_CURSO+',23) AS VARCHAR ) 

                                AND H.FECHA_INICIO >= CAST(CONVERT(VARCHAR(12),'+@MES_ANTERIOR+',23) AS VARCHAR ) 
                                ) B 
                        WHERE 
                            B.NUM_CONTRATO IS NOT NULL ) '

        EXEC (@SQL1 + @SQL2)    

        DELETE FROM #PERIODO 
        WHERE FECHA1 = @MES_ANTERIOR 
    END 
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-10-19 12:52:46

问题似乎在于以下几条线:

代码语言:javascript
复制
WHERE  H.FECHA_INICIO <  CAST(CONVERT(VARCHAR(12), ' + @MES_EN_CURSO + ', 23) AS VARCHAR) 

想必,您希望在聚合之外的cast()

代码语言:javascript
复制
WHERE  H.FECHA_INICIO < ' + CONVERT(VARCHAR(12), @MES_EN_CURSO + ', 23) + '

但是,我不建议将此作为解决方案。正确的解决方案是将值作为参数传入。您的查询太复杂(而且混乱),我无法尝试。您应该查看有关如何正确使用参数构造动态sp_executesql的文档。

票数 0
EN

Stack Overflow用户

发布于 2019-10-19 03:17:59

我认为您应该在遍历循环时使用print @SQL2,这样就可以看到不正确的值。

向您展示如何使用declare @MES_EN_CURSOdeclare @MES_ANTERIOR将是有帮助的。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58460176

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档