将 datetime 与 varchar 进行比较的最有效方法

Most efficient way to compare datetime to varchar

我正在使用第三方 Microsoft SQL 服务器数据库,其中大多数日期以 yyyy_MM_dd hh:mm:ss.SSS 格式保存为 varchar 列。在很多报告中,我需要 select 由两个日期时间变量定义的特定时间范围。我正在使用以下语句:

where cast(replace(a.somedate,'_','-') as datetime) between @begin and @end

我注意到使用此语句时,当需要处理大量记录时,查询会很快变得昂贵。将 varchar 与 datetime 进行比较的最有效方法是什么?

由于这是一个供应商应用程序,您无法控制架构,因此您可以重构 WHERE clause 以获取可搜索表达式,如下所示。这将允许有效地使用 somedateas 上的索引。例如:

WHERE a.somedateas BETWEEN REPLACE(CONVERT(varchar(19), @begin, 120), '-', '_') AND REPLACE(CONVERT(varchar(19), @end, 120), '-', '_')