bra*_*n85 1 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
Run Code Online (Sandbox Code Playgroud)
我得到的错误是:
消息242,级别16,状态3,行1
将varchar数据类型转换为smalldatetime数据类型导致超出范围的值。
我知道,如果该列采用日期格式,则可以使用来检查它,ISDATE()但是很遗憾,我无法更改列类型(没有权限)。
任何想法将不胜感激。
您可以使用isdate获取未为您进行转换的所有列表。您无需更改列类型即可使用它,因此我对您的陈述感到困惑
如果该列为日期格式,则可以使用ISDATE()进行检查,但是不幸的是,我无法更改列类型(没有权限)
如果您可以澄清,将提供更多帮助,但此查询应为您提供具有错误日期值的行的列表。
select table.date_as_varchar
from table
where isdate(table.date_as_varchar) = 0
Run Code Online (Sandbox Code Playgroud)
小智 5
添加到@workabyte 答案中,您还可以尝试使用TRY_PARSE, TRY_CASTOR TRY_CONVERT,NULL如果转换失败,它们都会返回,这样您就可以知道是哪一行导致了错误。
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)
| 归档时间: |
|
| 查看次数: |
5444 次 |
| 最近记录: |