我有这个查询给我一个错误
将 varchar 数据类型转换为 datetime 数据类型导致值超出范围。
询问:
select
COUNT(*)
from
dbo.patient
INNER JOIN
dbo.study on dbo.patient.pk = dbo.study.patient_fk
and dbo.study.study_datetime IS NOT NULL
and dbo.patient.pat_birthdate IS NOT NULL
and dbo.study.study_datetime <= DATEADD(D, -2192, GETDATE())
and dbo.patient.pat_birthdate <= DATEADD(D, -7670, GETDATE());
我读到这可能有助于转换为“DATETIME2”,但我不太清楚如何正确转换列“s.study_datetime”,因为该列很可能有一些错误的值作为条目。
您的 varchar 列中包含错误数据,并且您无法真正控制 SQL Server 何时尝试评估它们(在任何过滤发生之前或之后)。因此,您可以添加 where 子句以阻止它们被包含(通过仅检查值为日期的行),但仍然不能保证 where 子句的评估顺序(这意味着您可能仍然会得到一个错误)。因此,除了那些过滤器(可以在逻辑上替换您的 NOT NULL 过滤器)之外,您还可以确保仅在它们实际上是有效日期时才评估谓词。
接下来,请修复表格,使随机垃圾无法再进入这些列。首先使用以下方法识别不良数据:
然后相应地更正(它们可能都是相同模式中的“日期”,或者它实际上可能是一堆随机垃圾,您只需将其设置为 NULL)。一旦那里没有错误的值,您可以将数据类型更改为 DATE 或 DATETIME,因为它应该从一开始就是。
请参阅以下帖子: