从VarChar投射的SQL Server DateTime

时间:2011-05-13 20:51:01

标签: sql-server-2008 datetime type-conversion

我有一张包含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.

我不知道如何找到具有无效值的行,以及如何处理它。我想忽略它或修复它。

3 个答案:

答案 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