如何在SQL Server中获取24到48小时之间的记录

时间:2014-04-24 15:29:22

标签: sql sql-server

我想在24到36小时之间获得记录。

到目前为止,我有:

select * from tablename where DATEDIFF(DAY, dateColumn, GETDATE())>0

这将返回超过24小时的所有记录。我希望获得超过24岁但不超过36岁的记录。

由于

5 个答案:

答案 0 :(得分:5)

到目前为止,所有答案都是WHERE a.function(date_field) > 0;他们在您的搜索字段周围放置了一个函数。

不幸的是,这意味着RDBMS的优化器 不能 使用该字段上的任何索引。

相反,您可能会建议将计算和#34;移到右侧"。

SELECT
  *
FROM
  tablename
WHERE
      dateColumn >= DATEADD(HOUR, -36, GETDATE())
  AND dateColumn <  DATEADD(HOUR, -24, GETDATE())

此格式计算一次两个值,然后可以对索引执行范围搜索。而不是扫描整个表,一次又一次地重复相同的计算。

答案 1 :(得分:2)

注意:虽然这些是首先想到的解决方案,但它们并不像评论中所指出的那样次优。请参阅@ MatBailie的答案,找出更适合的解决方案。

虽然这些是自然的,并且在一些有限的用途中可能没问题,但你真的应该选择Search ARGument ABLE的解决方案。

  

Sargable

     

在关系数据库中,一个条件(或谓词)   如果DBMS引擎可以利用,则认为查询是可搜索的   加速查询执行的索引。该术语是派生的   来自搜索ARGument ABLE的收缩。

原始答案:

添加另一个条件:

select * 
  from tablename 
 where DATEDIFF(DAY, dateColumn, GETDATE())>0
   and DATEDIFF(HOUR, dateColumn, GETDATE()) <= 36

select * 
  from tablename 
 where DATEDIFF(HOUR, dateColumn, GETDATE()) BETWEEN 24 AND 36

注意:除了不可攻击之外,这个BETWEEN还包括24小时的记录,实际上OP要求24岁以上的记录。[OP使用几次,但澄清它不是包容性的SQL BETWEEN,而是一个半包容的,必须用&gt;实现和&lt; =。 ]

答案 2 :(得分:0)

您还必须指定36小时:

select * from tablename where DATEDIFF(DAY, dateColumn, GETDATE())>0 AND DATEDIFF(hh, dateColumn, GETDATE())<=36 

答案 3 :(得分:0)

使用:

select * from tablename where DATEDIFF(hour, dateColumn, GETDATE()) between 24 and 36

答案 4 :(得分:0)

SELECT * FROM tablename WHERE DATEDIFF(hh,dateColumn,GETDATE()) between 24 and 36