2017-08-01 103 views
3

我在我的数据库中有一堆数据,我想过滤掉超过一周的存储数据。我使用的是SQLServer,我发现我可以使用'DATEDIFF'函数。SQL查询 - 匹配日期时间与匹配整数

目前,它的工作非常快,但目前我没有很多记录,因此任何事情都可以顺利进行。

经过一些在线研究后,我发现数据库中整数的比较比字符串的比较快,我现在假设日期时间(使用给定函数)的比较在主要规模上甚至更慢。

比方说,我的数据库表中的内容是这样的: enter image description here

目前,我会过滤掉旧的像一个星期,像这样记录:

SELECT * FROM onlineMainTable WHERE DATEDIFF(wk, Date, GETDATE()) > 1 

我认为这个查询将是相当如果桌子上有一千行,就会变慢。

状态栏代表一个计算状态,我想知道如果我要寻找一个特定的状态而不是匹配的日期时间,我是否会加快过程,对于我来说,为了将该状态设置为代表'旧记录'我需要更新这些行之前,我选择它们,它会看起来像这样:

UPDATE table SET Status = -1 WHERE NOT Status = -1 AND DATEDIFF(wk, Date, GETDATE()) > 1; 
SELECT * FROM table WHERE Status = -1; 

我用'-1'为例。

所以很明显我可能是错的,但我认为更新在这种情况下将会足够快,因为不会有那么多记录要更新,因为较旧的更新已经与它的状态。选择会更快,因为我会匹配整数而不是日期。

我的(可能的)解决方案的缺点是每次获取数据时我都会查询两次,即使可能不需要(如果每行都比1周更新)。

归结为这样:我应该比较日期时间还是应该更新基于该日期时间的整数列,然后选择使用这些整数的比较?

如果有一个不同的/更好的方式做到这一点我是耳朵。

上下文 我正在为引用请求做一个webapp。请求应在一周后过期,因为它们在那时不会有效。我需要显示有效的请求和过期的请求(所以消费者有一个概述)。所有这些请求都存储在数据库表中。

+0

你能给你的意思是“超过一周”什么例子?您的代码与保留过去7天的数据不同。 –

+0

@GordonLinoff上面写的查询获取超过一周的行,所有数据都保留为 – Dubb

+0

。 。您的逻辑保留最近一整周以及此后的任何日期的所有行。目前还不清楚这是否意味着“存储了超过一周的时间”。这不是我如何解释你的描述。 –

回答

2

索引是旨在提高选择查询性能的对象,缺点是它们减慢了插入删除和更新操作,因此必须在必要时使用它们。通常DBMS提供工具来解释查询执行计划。

也许你只是需要在日期列中添加索引:

create index "index_name" on onlineMainTable(Date) 

和查询可能是

SELECT * FROM onlineMainTable WHERE Date > DATEADD(week,-1,GETDATE()); 
+0

我会研究这个,谢谢你的回应! – Dubb

+0

为什么索引会加快速度?也许是一个愚蠢的问题,但是不管它是否被索引或不是遍历整个表? – Dubb

+2

如果有索引,它将被扫描,而如果它被实现为二叉树,它已经排序 –