【发布时间】:2018-05-10 16:22:30
【问题描述】:
我正在使用第三方 Microsoft SQL Server 数据库,其中大多数日期以yyyy_MM_dd hh:mm:ss.SSS 格式保存为varchar 列。在很多报告中,我需要选择由两个日期时间变量定义的特定时间范围。我正在使用以下语句:
where cast(replace(a.somedate,'_','-') as datetime) between @begin and @end
我注意到,当需要处理大量记录时,使用此语句查询会很快变得昂贵。将 varchar 与日期时间进行比较的最有效方法是什么?
【问题讨论】:
-
您不能修复数据库以便正确存储日期吗?
-
如何创建一个持久化的计算字段?如果提供数据库的系统仍在运行?
-
在这种情况下,您可以为
@begin and @end指定一个类似格式的varchar 值。最好修复架构以存储为datetime或datetime2(0)。 -
补充一下@DanGuzman 所说的,如果
somedate上有索引,where somedate >= '2000_01_01 00:00:00.000' and somedate < '2001_01_01 00:00:00.000'应该给你一个索引搜索,这是由于 ISO 日期可以通过词法排序来比较。如果没有索引并且您无法添加索引,那么在任一方向优化操作都没有什么意义,因为比较不是瓶颈——扫描所有单独的行才是。 -
如果您无法更改来源,那么我建议您与您的软件供应商支持团队交谈,并与他们讨论。 优秀的软件供应商应该知道如何正确存储数据。
标签: sql-server tsql datetime varchar