【问题标题】:Most efficient way to compare datetime to varchar将日期时间与 varchar 进行比较的最有效方法
【发布时间】: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 值。最好修复架构以存储为datetimedatetime2(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


【解决方案1】:

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

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

【讨论】:

  • 谢谢,这就是我最终做的。除了我使用 varchar(23) 来获取整个日期时间。
猜你喜欢
  • 1970-01-01
  • 2014-05-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-24
相关资源
最近更新 更多