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

时间:2015-02-23 19:31:05

标签: sql sql-server date-conversion

我正在尝试从smalldatetime投射varchar列。有些行包含错误,我该如何找到它们?

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

我得到的错误是:

  

Msg 242,Level 16,State 3,Line 1
  将varchar数据类型转换为smalldatetime数据类型会导致超出范围的值。

我知道如果列是日期格式,我可以使用ISDATE()进行检查,但遗憾的是我无法更改列类型(没有权限)。

任何想法都将不胜感激。

2 个答案:

答案 0 :(得分:4)

您可以使用isdate获取所有未转换的列表。你不需要改变列类型来使用它,所以我对你的陈述感到困惑

  

如果列是日期格式,我可以使用ISDATE()检查它,但遗憾的是我无法更改列类型(没有权限)

如果您可以澄清,那么会有更多帮助,但是此查询应该会为您提供包含错误日期值的行列表。

select table.date_as_varchar
from table
where isdate(table.date_as_varchar) = 0

答案 1 :(得分:2)

添加到@workabyte答案,您也可以尝试使用TRY_PARSETRY_CASTTRY_CONVERT,如果转换失败,所有这些都会返回NULL,这样您就可以知道行导致错误。

<强> TRY_PARSE

正如documentation所说:

  

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

用法示例:

SELECT TRY_PARSE(your_date  AS DATETIME USING 'es-ES') as date
FROM your_table

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

<强> TRY_CONVERT

正如documentation所说:

  

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

用法示例:

SELECT TRY_CONVERT(DATETIME,your_date,103) as date
FROM your_table

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

<强> TRY_CAST

正如documentation所说:

  

TRY_CAST获取传递给它的值并尝试将其转换为   指定的data_type。如果转换成功,则TRY_CAST返回该值   作为指定的data_type;如果发生错误,则返回null。   但是,如果您请求明确不允许的转换,   然后TRY_CAST因错误而失败。

用法示例:

SELECT TRY_CAST(your_date AS DATETIME) as date
FROM your_table