我正在尝试从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()
进行检查,但遗憾的是我无法更改列类型(没有权限)。
任何想法都将不胜感激。
答案 0 :(得分:4)
您可以使用isdate获取所有未转换的列表。你不需要改变列类型来使用它,所以我对你的陈述感到困惑
如果列是日期格式,我可以使用ISDATE()检查它,但遗憾的是我无法更改列类型(没有权限)
如果您可以澄清,那么会有更多帮助,但是此查询应该会为您提供包含错误日期值的行列表。
select table.date_as_varchar
from table
where isdate(table.date_as_varchar) = 0
答案 1 :(得分:2)
添加到@workabyte答案,您也可以尝试使用TRY_PARSE
,TRY_CAST
或TRY_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