我想在24到36小时之间获得记录。
到目前为止,我有:
select * from tablename where DATEDIFF(DAY, dateColumn, GETDATE())>0
这将返回超过24小时的所有记录。我希望获得超过24岁但不超过36岁的记录。
由于
答案 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