Between 子句在查询中未给出所需结果

Between clause not giving desired results in query

我需要 return 来自基于 datetime2 的 mssql 存储过程的结果。有一名员工 table 有上班和下班时间。我需要 return 根据开始时间和结束时间从员工那里得到所有数据。我的查询有点像

Select * 
from   employee 
where  empid ='123' 
and     punchin  between 'starttime' and 'endtime' 
and     punchout between 'starttime' and 'endtime'

此查询不是return预期的结果。我在这里做错了什么吗,在打入或打出之间,一列可以为空,在这种情况下,结果将在一列的基础上 returned。

基于假设:

Table 结构:

CREATE TABLE employee (
  empid VARCHAR(20) not null,
  punchin datetime2(7),
  punchout datetime2(7)
)

示例数据:

INSERT INTO employee VALUES
('1', null, '2021-03-28 10:50:00'),
('2', '2021-03-28 05:00:00', '2021-03-28 9:00:00'),
('3', '2021-02-28 05:00:00', null)

程序:

CREATE PROCEDURE getData
@empid VARCHAR(20),
@startTime datetime2(7),
@endTime datetime2(7)
AS
BEGIN
  SELECT *
  FROM employee
  WHERE empid = @empid
    AND (punchin IS NULL OR (punchin IS NOT NULL AND punchin >= @startTime))
    AND (punchout IS NULL OR (punchout IS NOT NULL AND punchout <= @endTime))
END

用法:

EXEC getData '1', '2021-03-27 10:50:00', '2021-03-27 10:50:00'

看看它是否有效。

注意:没有适当的结构或数据,很难根据假设做事。