返回介于特定小时值之间的数据

编程语言 2026-07-11

我想确定是否可以在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导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章