Sql 错误:从字符串转换日期和/或时间时转换失败(发生在where子句中)

Sql 错误:从字符串转换日期和/或时间时转换失败(发生在where子句中),sql,sql-server-2012,Sql,Sql Server 2012,我试图解决以下代码的错误,但不知道如何做到这一点 在where条件中,我检查了concat字符串,它们以字符串格式返回日期,但错误发生在转换过程中的某个地方 有人能告诉我在哪里以及如何解决这个问题吗 提示:ERSConstructedVariable\u ExecutionDate是表中的datetime数据类型 @OutputTimeDimensionvalue='1989-1998' 代码: 如果我理解正确,第二年从第8位开始,而不是第7位。但是,请尝试使用left()和right(): S

我试图解决以下代码的错误,但不知道如何做到这一点

在where条件中,我检查了concat字符串,它们以字符串格式返回日期,但错误发生在转换过程中的某个地方

有人能告诉我在哪里以及如何解决这个问题吗

提示:
ERSConstructedVariable\u ExecutionDate
是表中的
datetime
数据类型

@OutputTimeDimensionvalue
='1989-1998'

代码:


如果我理解正确,第二年从第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'))

如果我理解正确,第二年从第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'))

不要对没有转换号的日期使用CONVERT

鉴于
@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
)

不要对没有转换号的日期使用CONVERT

鉴于
@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
)

不要对没有转换编号的日期使用
CONVERT
。请参见此处:选择正确的格式并使用它。如果同时删除
-
分隔符,则可以使用格式112。请注意,
datetime2
也有一个时间组件。也许数据类型
date
会更好?@Nick.McDermaid。虽然我同意转换数字是一个好主意,但SQL Server具有内置格式,可以独立于其他设置进行转换。所以像YYYY-MM-DDTHH:MM:SS一样,诸如YYYYMMDD(以及在几乎所有情况下YYYY-MM-DD)之类的ANSI标准格式都很容易得到支持。千万不要对没有转换号的日期使用
CONVERT
。请参见此处:选择正确的格式并使用它。如果同时删除
-
分隔符,则可以使用格式112。请注意,
datetime2
也有一个时间组件。也许数据类型
date
会更好?@Nick.McDermaid。虽然我同意转换数字是一个好主意,但SQL Server具有内置格式,可以独立于其他设置进行转换。因此,像YYYYMMDD(以及在几乎所有情况下YYYY-MM-DD)这样的ANSI标准格式都很容易得到支持,YYYY-MM-DDTHH:MM:SS也是如此。@gowthamramamoorth稍微观察一下,
ExecutionDate
的结束日期范围可能是12-31,而不是01-01。。千万不要在日期没有转换号的情况下使用
CONVERT
。@gowthamramamoorth稍微观察一下,
ExecutionDate
的结束日期范围可能是12-31,而不是01-01。。切勿在日期没有转换号的情况下使用
CONVERT