如何 select 从 SQL 服务器系统版本 table 记录给定日期

How to select records for a given date from SQL Server system-versioned table

我正在使用 SQL Server 2019。

我正在使用这样的系统版本 table:

CREATE TABLE Employee
(
    EmployeeID int PRIMARY KEY NOT NULL,
    FirstName varchar(100) NOT NULL, 
    LastName varchar(100) NOT NULL, 
    -- Some other columns
    StartTime datetime2 (7) GENERATED ALWAYS AS ROW START NOT NULL,
    EndTime datetime2(7) GENERATED ALWAYS AS ROW START NOT NULL, 
    PERIOD FOR SYSTEM_TIME (StartTime,EndTime) 
) 
WITH (SYSTEM_VERSIONING = ON(HISTORY_TABLE = dbo.EmployeeHistory));

table 和列的名称已更改,但这是 table 的创建方式。

我的问题很简单,但我找不到满意的答案。

此 table 可供最终用户使用,选项之一是提供日期时间 SearchDate,我想 return Employee table 这是这个日期制作的。

然而,即使用户可能不仅发送日期而且发送时间,响应也应该包含在 SearchDate 中给定日期的所有记录并忽略时间。

基本上我发现的与系统版本相关的查询 table 非常简单:

SELECT *
FROM dbo.Employee
FOR SYSTEM_TIME BETWEEN @SearchDate AND ???
WHERE dbo.Employee.EmployeeID=2

经过研究,我发现我可以利用系统版本 table 并在 after given DateTime 中搜索或在给定中搜索DateTime 范围,我发现了几种不同的语法,最后它们似乎提供了相同的结果。遗憾的是,我找不到内置的东西来搜索整个日期。

所以我的问题是 - 有没有办法利用我使用系统版本 tabled 的事实并过滤给定日期的所有记录,无论时间组件如何。

如果不是,我认为一个不错的解决方法是使用此子句 FOR SYSTEM_TIME BETWEEN。作为输入,我得到 DECLARE @SearchDate DATETIME2(7) 所以我也会接受一个查询作为答案,该查询将这个 @SearchDate 并以我可以提取 DateTime 的正确格式的方式转换它,这将指示最开始@SearchDate 日期和 @SearchDate 日期的最后,所以我可以在 BETWEEN 语法中使用这些值?

您可以只使用 DATEADDCAST 来获取一天的开始和结束

DECLARE @startDate datetime2(7) = CAST(@SearchDate AS date);
DECLARE @endDate datetime2(7) = DATEADD(day, 1, @startDate);

SELECT *
FROM dbo.Employee
FOR SYSTEM_TIME BETWEEN @startDate AND @endDate
WHERE dbo.Employee.EmployeeID = 2;

注意BETWEEN,不包括起点,包括终点。