我有一张包含900万条记录的表格。每个都有一个“BirthDate”字段,存储为varchar。我试图选择所有出生日期为25年或更短的地方(所有25岁或以下的人)。它失败了,因为在这个怪物的某个表中,有一个无效的值。
select COUNT(*) from LeadSplit where CAST(LeadSplit.Birthdate as datetime) > DATEADD(yy, -26, getdate()) and Birthdate is not null
错误是:
Msg 242, Level 16, State 3, Line 1
The conversion of a varchar data type to a datetime data type resulted in an out-of-range value.
我不知道如何找到具有无效值的行,以及如何处理它。我想忽略它或修复它。
答案 0 :(得分:3)
您可以尝试通过执行以下操作来查找有问题的行:
SELECT (some ID), Birthdate
FROM dbo.YourTable
WHERE ISDATE(Birthdate) = 0
这可能不适用于所有情况 - 但它可能会给你一个起点。
答案 1 :(得分:2)
您得到的错误是,在DateFormat设置下,无法解析一个或多个日期。
Set DateFormat MDY
GO
Select Count(*)
From LeadSplit
Where Case
When IsDate(BirthDate) = 0 Then 0
When BirthDate >= DateAdd(yyyy,-25,CURRENT_TIMESTAMP) Then 1
End = 1
答案 2 :(得分:1)
尝试使用CONVERT而不是CAST并明确指定日期格式。 MSDN Article about CAST and CONVERT