如何摆脱以下错误?从字符串转换日期失败

时间:2018-09-05 23:25:25

标签: sql-server

在SQL Server中,出现错误:

  

错误-2147217913:从字符串转换日期和/或时间时转换失败。

Error in converting

我确定我的字段在日期字段中,但是为什么继续显示此错误?

首先,我首先验证了数据类型是否真的是日期列:

 CASE 
    WHEN ISDATE(dbo.AdditionalDetailInfo.UserDefined2) = 1 
       THEN dbo.AdditionalDetailInfo.UserDefined2 
       ELSE NULL 
 END AS ReceivedDate

我发现是的,这是正确的。因此,我将转换此字段,其中UserDefined2值应始终加1天。

CONVERT(VARCHAR(12), DATEADD(DAY, 1, CONVERT(DATETIME, dbo.AdditionalDetailInfo.UserDefined2)), 103) AS ReceivedDate

请让我知道我的查询是否有问题,因为我真的无法诊断出问题所在。

查看屏幕截图:

See this link, the actual data and in SQL server + 1 day

3 个答案:

答案 0 :(得分:0)

也许该字段确实是日期字段,所以可能不需要转换。尝试DATEADD(DAY, 1, dbo.AdditionalDetailInfo.UserDefined2)

如果该列确实是字符串列,则您在读取值时忘记指定 style 参数,而仅在转换时使用它。尝试以下方法:

CONVERT(VARCHAR(12), DATEADD(DAY, 1, CONVERT(DATETIME, dbo.AdditionalDetailInfo.UserDefined2, 103)), 103) AS ReceivedDate

答案 1 :(得分:0)

MSDN表示不允许将日期,时间和日期时间类型作为ISDATE的参数,但实际上是将日期传递给它:

SELECT ISDATE(getutcdate())

导致日期时间隐式转换为varchar,并将其作为varchar传递给ISDATE,然后迅速返回1

因此,我们无法保证您的列确实是您所说的日期类型,因此我猜测它可能是字符串。

确实,您应该做的是将列更改为日期类型。不要将日期存储为字符串;如果Microsoft打算让您这样做并且认为这是一个好主意,那么他们将不会实现除基于char的列类型之外的其他列类型

如果您无法将列转换为日期,则需要查找错误的值:

select * from table where isdate(column) =0

请注意,您尝试转换样式103(dd / mm / yyyy)的操作可能会失败,因为您拥有的数据不是这种样式,例如圣诞节为2000年12月25日

Isdate可能不会接受此操作,因为您的数据库日期格式设置为mm / dd / yyyy,而isdate认为还可以。更改数据库日期格式,以便isdate可以正确判断什么是好日期和什么是坏日期

https://docs.microsoft.com/en-us/sql/t-sql/functions/isdate-transact-sql?view=sql-server-2017

然后,为了正确执行此操作,请使用日期类型的列,而不是字符串类型的

答案 2 :(得分:0)

我们需要更多信息。特别是,我们需要知道UserDefined2是什么数据类型。如果您告诉我们,那么我们可以给出更好的答复。

请注意,ISDATE是一个非常不值钱的函数,因为如果字符串可转换为日期时间,则它将返回1。但是,如果您真正拥有datetime2怎么办?还是smalldatetime?因此,请改用TRY_CAST。

此外,您还给了我们一些查询,表达式。我们看不到上下文。 SQL Server中有一种称为谓词推送的东西,它可能会为您搞砸(SQL Server将谓词更深入地推送到查询中,导致即使您认为您也可以对非日期时间值使用表达式在WHERE子句中排除了它们。

另外,请注意,当您使用分隔符并使用旧类型(datetime或datetime2)时,如何解释datetime值取决于登录语言的设置。

http://karaszi.com/the-ultimate-guide-to-the-datetime-datatypes中的更多信息