我的数据库中有一堆数据,我想过滤掉存储时间超过一周的数据。我正在使用 SQLServer,我发现我可以使用“DATEDIFF
”函数。
目前它运行良好且速度很快,但目前我没有很多记录,因此一切都运行得很顺利。
经过一些在线研究后,我发现数据库中整数的比较比字符串的比较更快,我假设在这一点上,日期时间的比较(使用给定的函数)在主要规模上甚至更慢。
目前我会像这样过滤掉一周前的记录:
SELECT * FROM onlineMainTable WHERE DATEDIFF(wk, Date, GETDATE()) > 1
我假设如果表中有上千行,这个查询会很慢。
status 列表示计算状态,我想知道如果我要查找特定状态而不是匹配日期时间,我是否会加快该过程,以便将该状态设置为代表“旧记录”的状态' 我需要在选择它们之前更新这些行,它看起来像这样:
UPDATE table SET Status = -1 WHERE NOT Status = -1 AND DATEDIFF(wk, Date, GETDATE()) > 1;
SELECT * FROM table WHERE Status = -1;
我以“-1”为例。
所以显然我可能是错的,但我认为在这种情况下更新会足够快,因为不会有那么多记录要更新,因为较旧的记录已经更新了其状态。选择也会更快,因为我将匹配整数而不是日期时间。
我的(可能的)解决方案的缺点是我每次获取数据时都会查询两次,即使可能不需要它(如果每一行都比 1 周新)。
归结为:我应该比较日期时间还是应该根据该日期时间更新整数列,然后使用这些整数的比较进行选择?
如果有不同/更好的方法,我会洗耳恭听。
上下文 我正在为报价请求制作一个网络应用程序。请求应在一周后过期,因为届时它们将无效。我需要同时显示有效请求和过期请求(以便客户有一个概览)。所有这些请求都存储在数据库表中。
最佳答案
索引是旨在提高选择查询性能的对象,缺点是它们会减慢插入删除和更新操作的速度,因此必须在必要时使用它们。通常 DBMS 提供工具来解释查询执行计划。
也许您只需要在 Date 列上添加一个索引:
create index "index_name" on onlineMainTable(Date)
查询可以是
SELECT * FROM onlineMainTable WHERE Date > DATEADD(week,-1,GETDATE());
关于SQL 查询 - 匹配日期时间与匹配整数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45434491/