在 SQL Server 中出现“超出范围值”错误后如何查找错误日期?
Posted
技术标签:
【中文标题】在 SQL Server 中出现“超出范围值”错误后如何查找错误日期?【英文标题】:How to find the wrong dates after an 'out-of-range value' error in SQL Server? 【发布时间】:2022-01-22 02:52:23 【问题描述】:我想将格式为mm/dd/yyyy
的列转换为日期时间,但是当我这样做时出现以下错误:
The conversion of a varchar data type to a datetime data type resulted in an out-of-range value.
我在其他帖子中发现这意味着某些日期没有意义,例如10/35/2021
。我试图通过切片 varchars 来找到错误的日期以获取 SUBSTRING(date, 3, 2)
的日期,但事实证明有些日期的格式为 m/d/yyyy
,所以当我切片时,我会得到类似 1/
的内容。
我不知道如何找到错误的日期,以及如何(即使有错误的日期)将所有内容转换为日期时间。
谢谢!
【问题讨论】:
所以有些数据在MM/dd/yyyy
,而其他数据在M/d/yyyy
?这确实是您需要修复的设计。
您认为“2021 年 1 月 2 日”之类的正确解释是什么?是 1 月 2 日还是 2 月 1 日?你只能希望能找到days > 31这样明显的问题,但这并不意味着你成功转换其他值是正确的。
要检测错误的日期,您可以使用TRY_CAST,当演员出现问题时,它会返回NULL
@SM 或者它认为可能是 1 月 2 日,因为它位于美国。
【参考方案1】:
如果您的一些数据在MM/dd/YYYY
和一些M/d/yyyy
中,这确实会造成一些混乱。我可能会这样做:
--Add a new varchar column (yes varchar) to save a copy of your bad data
ALTER TABLE dbo.YourData ADD BadDate varchar(10);
GO
--Change the data you have to the ISO format yyyyMMdd and store the bad data in the BadDate column
UPDATE dbo.YourData
SET DateColumn = CONVERT(varchar(8),TRY_CONVERT(date,DateColumn,101),112),
BadDate = CASE WHEN TRY_CONVERT(date,DateColumn,101) IS NULL THEN DateColumn END
WHERE DateColumn IS NOT NULL;
GO
--Change data type of your data column
ALTER TABLE dbo.YourData ALTER COLUMN DateColumn date NULL;
GO
--You can view your bad data with:
SELECT BadData
FROM dbo.YourData
WHERE BadData IS NOT NULL;
【讨论】:
谢谢,我会试试的!现在我发现我在 yyyy-ww-0 中有一些日期,这使得它变得更加混乱...... 只是将日期存储在基于字符串的数据类型中是一个非常愚蠢的想法的众多原因之一,@AldanaBRZ。您的数据似乎没有任何有效性,因此基本上整列毫无价值,数据毫无意义。【参考方案2】:如果您只想找到值显然是错误日期的行 - 忽略任何歧义 - 只需使用 try_convert
并检查 NULL
例如
with dates as (
select * from (values('01/02/2021'),('02/01/2021'),('33/02/2021'),('01/13/2021'))v(d)
)
select *
from dates
where Try_Convert(date, d) is null
【讨论】:
这看起来是个好方法,我会试试的。谢谢!现在我发现我在 yyyy-ww-0 中有一些日期,这让情况变得更糟......以上是关于在 SQL Server 中出现“超出范围值”错误后如何查找错误日期?的主要内容,如果未能解决你的问题,请参考以下文章
sql server 2005数据库检索时,出现无法为此请求检索数据的问题
求解!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!SQL Server 2012 出现以下错误: