2016-01-29 77 views
0

我试图解决以下代码的错误,但不知道如何执行此操作。错误:从字符串转换日期和/或时间时发生转换失败(发生在where子句中)

在where条件中,我检查了以字符串格式返回日期的concat字符串,但错误发生在转换的某处。

有人可以让我知道在哪里以及如何解决这个问题。

提示:ERSConstructedVariable_ExecutionDate是表中的datetime数据类型。

@OutputTimeDimensionvalue = '1989年至1998年'

代码:

SELECT 
    Column1, column2, column3 
FROM 
    Table1 CV 
WHERE 
    CV.ERSConstructedVariable_ExecutionDate 
     BETWEEN CONVERT(datetime2, CONCAT(substring(@OutputTimeDimensionvalue, 1, 4), '-01', '-01')) 
      AND CONVERT(datetime2,CONCAT((substring (@OutputTimeDimensionvalue, 7, 4)), '-01', '-01')) 
+0

千万不要使用'CONVERT'对一个日期,而无需转换数。看到这里:https://msdn.microsoft.com/en-us/library/ms187928.aspx选择正确的格式并使用它。如果完全删除'-'分隔符,则可以使用格式112.请注意'datetime2'也有一个时间分量。也许数据类型'日期'会更好? –

+0

@ Nick.McDermaid。 。 。虽然我同意转换数字是一个好主意,但SQL Server具有内置格式,可以很容易地转换*独立于其他设置*。因此,YYYYMMDD(几乎在所有情况下YYYY-MM-DD)等ANSI标准格式都很容易支持,YYYY-MM-DDTHH:MM:SS也是如此。 –

回答

1

如果我理解正确的话,第二年开始第8位,而不是7。但是,尝试left()right()代替:

SELECT Column1, column2, column3 
FROM Table1 CV 
WHERE CV.ERSConstructedVariable_ExecutionDate BETWEEN 
      CONVERT(datetime2, CONCAT(LEFT(@OutputTimeDimensionvalue, 4), '-01-01')) AND 
      CONVERT(datetime2, CONCAT(RIGHT(@OutputTimeDimensionvalue, 4), '-01-01')) 
+0

@GowthamRamamoorthy稍微观察一下,'ExecutionDate'的结束日期范围可能是12-31而不是01-01 – Eric

+0

再次..不要在没有转换号的日期使用'CONVERT'。 –

1

永远不要使用CONVERT对不带转换编号的日期

https://msdn.microsoft.com/en-us/library/ms187928.aspx

鉴于@OutputTimeDimensionvalue = '1989 - 1998'我建议以下代码:

SELECT Column1,column2,column3 
FROM Table1 CV 
WHERE 
CV.ERSConstructedVariable_ExecutionDate 
BETWEEN CONVERT(
    datetime2, 
    CONCAT(substring(@OutputTimeDimensionvalue,1,4),'0101'), 
    112 
) AND 
CONVERT(
    datetime2, 
    CONCAT((substring (@OutputTimeDimensionvalue,8,4)),'0101'), 
    112 
) 
相关问题