返回介于特定小时值之间的数据
我想确定是否可以在DateTime值对应的时间里查询位于两个定义好的小时数之间的数据,而不需要把每个DateTime的迭代逐一写出。这个需求是在跨越多天的时间范围内,找出每天在特定小时段的匹配值。
在过去,我用冗长的方式来实现这个需求,结果可能会相当长:
select TrxnDate, UserName, UserType
from MyTable
where (TrxnDate BETWEEN '01/01/2026 00:00:00.000' AND '01/01/2026 05:59:59.999', OR TrxnDate BETWEEN '01/02/2026 00:00:00.000' AND '01/02/2026 05:59:59.999')
我尝试将DATEPART与 BETWEEN结合使用,但它们似乎不太搭配。后来我尝试了另一种查询方式,取得了一些成功:
select TrxnDate, UserName, UserType
from MyTable
where DATEPART(hour,TrxnDate) <= 6
是否有办法使用DATEPART与 BETWEEN这样结合,还是应该用另一种方式来组织结构?
解决方案
你表中的TrxnDate列名是个误称,它并不包含日期,而是日期时间/时间戳。现在你想要选择落在某个日期范围内、并且还落在某个小时范围内的所有行。
这个查询
SELECT TrxnDate, UserName, UserType
FROM MyTable
WHERE (TrxnDate >= '2026-01-01 01:00:00' AND TrxnDate < '2026-01-01 06:00:00')
OR (TrxnDate >= '2026-01-02 01:00:00' AND TrxnDate < '2026-01-02 06:00:00')
OR (TrxnDate >= '2026-01-03 01:00:00' AND TrxnDate < '2026-01-03 06:00:00')
可以被简化为
SELECT trxndate, username, usertype
FROM mytable
WHERE trxndate >= '2026-01-01'
AND trxndate < '2026-01-04'
AND DATEPART(HOUR, trxndate) BETWEEN 1 AND 5;
或者强制转换成 TIME:
AND CAST(trxndate AS TIME) >= '01:00:00'
AND CAST(trxndate AS TIME) < '06:00:00';
这也给你提供了过滤像02:30到 04:45这样的时间范围的选项。
在trxndate上有索引时,这可以相当快,因为你可以快速定位到相关的日期,然后再只需要过滤小时。
不过,你也可以添加计算列并对它们建立索引:
ALTER TABLE mytable ADD trxndate_dt AS (CAST(trxndate AS DATE));
ALTER TABLE mytable ADD trxndate_tm AS (CAST(trxndate AS TIME));
CREATE INDEX idx ON mytable(trxndate_dt, trxndate_tm);
这应当能让对数据的访问速度更快:
SELECT trxndate, username, usertype
FROM mytable
WHERE trxndate_dt >= '2026-01-01'
AND trxndate_dt < '2026-01-04'
AND trxndate_tm >= '01:00:00'
AND trxndate_tm < '06:00:00';
站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。