在SQL Server中查找导致类型转换错误的行

bra*_*n85 1 sql sql-server date-conversion

我想投一个列smalldatetimevarchar。有些行包含错误,如何找到它们?

SELECT 
    PA.EAR_TAG 
    ,ISNULL(B.DISPOSAL_DATE, H.DISPOSAL_DATE) as HB_Date
    ,Y.[DATE OF MOVEMENT] as Y_Date
    ,DATEDIFF(DAY, ISNULL(B.DISPOSAL_DATE, H.DISPOSAL_DATE), cast(Y.[DATE OF MOVEMENT] as smalldatetime))
FROM
    DairyTelomere.dbo.PROJECT_ANIMALS AS PA
LEFT JOIN 
    Langhill.dbo.YOUNG_STOCK_BULL AS B ON Pa.EAR_TAG = B.EAR_TAG
LEFT JOIN      
    Langhill.dbo.YOUNG_STOCK_HEIFER AS H ON PA.EAR_TAG = H.EAR_TAG
LEFT JOIN      
    DairyTelomere.dbo.Young_Stock_culls AS Y ON PA.EAR_TAG = Y.Ear_Tag
Run Code Online (Sandbox Code Playgroud)

我得到的错误是:

消息242,级别16,状态3,行1
将varchar数据类型转换为smalldatetime数据类型导致超出范围的值。

我知道,如果该列采用日期格式,则可以使用来检查它,ISDATE()但是很遗憾,我无法更改列类型(没有权限)。

任何想法将不胜感激。

wor*_*yte 7

您可以使用isdate获取未为您进行转换的所有列表。您无需更改列类型即可使用它,因此我对您的陈述感到困惑

如果该列为日期格式,则可以使用ISDATE()进行检查,但是不幸的是,我无法更改列类型(没有权限)

如果您可以澄清,将提供更多帮助,但此查询应为您提供具有错误日期值的行的列表。

select table.date_as_varchar
from table
where isdate(table.date_as_varchar) = 0
Run Code Online (Sandbox Code Playgroud)

  • 假设周围有一个类似“ ISDATE”的函数,这是一个很好的答案。但是,假设您拥有数字数据,而且我们知道ISNUMERIC不受信任(http://www.sqlservercentral.com/articles/ISNUMERIC%28%29/71512/)?一般来说,我喜欢`TRY_CAST`。但这并不是要摆脱您的解决方案;在这里完全可以维修。 (2认同)

小智 5

添加到@workabyte 答案中,您还可以尝试使用TRY_PARSE, TRY_CASTOR TRY_CONVERTNULL如果转换失败,它们都会返回,这样您就可以知道是哪一行导致了错误。

TRY_PARSE

正如文档所说:

仅将 TRY_PARSE 用于从字符串转换为日期/时间和数字类型。对于一般类型转换,继续使用 CAST 或 CONVERT。请记住,解析字符串值会产生一定的性能开销。

用法示例:

SELECT TRY_PARSE(your_date  AS DATETIME USING 'es-ES') as date
FROM your_table
Run Code Online (Sandbox Code Playgroud)

es-ES 是文化参数,不同的文化参数在您的转换中产生不同的结果,您可以在文档中找到完整的参数列表

TRY_CONVERT

正如文档所说:

TRY_CONVERT 获取传递给它的值并尝试将其转换为指定的 data_type。如果转换成功,TRY_CONVERT 返回指定数据类型的值;如果发生错误,则返回 null。但是,如果您请求明确不允许的转换,则 TRY_CONVERT 会失败并显示错误。

用法示例:

SELECT TRY_CONVERT(DATETIME,your_date,103) as date
FROM your_table
Run Code Online (Sandbox Code Playgroud)

103 是您要转换的日期的样式/格式,在这里您可以找到可用的格式列表

TRY_CAST

正如文档所说:

TRY_CAST 获取传递给它的值并尝试将其转换为指定的 data_type。如果转换成功,TRY_CAST 返回指定数据类型的值;如果发生错误,则返回 null。但是,如果您请求明确不允许的转换,则 TRY_CAST 会失败并显示错误。

用法示例:

SELECT TRY_CAST(your_date AS DATETIME) as date
FROM your_table
Run Code Online (Sandbox Code Playgroud)