如何 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
语法中使用这些值?
您可以只使用 DATEADD
和 CAST
来获取一天的开始和结束
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
,不包括起点,包括终点。
我正在使用 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
语法中使用这些值?
您可以只使用 DATEADD
和 CAST
来获取一天的开始和结束
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
,不包括起点,包括终点。