sql - 如何检测 SQL 中两个日期时间之间的重叠?

标签 sql sql-server sql-server-2008 sql-server-2008-r2

我有一个如下表:

EmpId   DateTimeIn                  DateTimeOut                 Effort
1030    2016-12-01 07:30:00.000     2016-12-01 12:30:00.000     1030
1030    2016-12-01 13:30:00.000     2016-12-01 16:30:00.000     1531

员工 1030 已在 2016 年 12 月 1 日的 07:30 至 12:30 和 13:30 至 16:30 时间范围内插入了自己的努力。

此后,他不应在这些时间范围内投入精力。他可以在 2016 年 12 月 1 日的 07:30 或 12:30 之前至 13:30 或 16:30 之后参加比赛,也可以在任何其他日期参加。

为了实现此目的,我编写了一个以下查询,但它总是抛出错误并且不允许用户插入数据。请帮忙。

IF EXISTS (SELECT 1 FROM TimesheetEntries 
WHERE EmpId = @EmpId AND (@DateTimeIn >= DateTimeIn AND @DateTimeIn < DateTimeOut)  
OR (@DateTimeOut >= DateTimeOut AND @DateTimeOut < DateTimeIn))
BEGIN
    RAISERROR ('You already input your effort for the given time range.',16,1)
    RETURN 
END

最佳答案

看起来像是一个括号问题 - 您没有将 OR 的两个部分与 EmpId = @EmpId 进行 AND 操作。看起来逻辑也有点错误(您检查 @DateTimeOut 晚于 DateTimeOut 且早于 DateTimeIn,如果 DateTimeOut > DateTimeIn 正如我们所期望的,永远不会满足)。

尝试:

IF EXISTS 
(
    SELECT 1 
    FROM TimesheetEntries 
    WHERE EmpId = @EmpId 
    AND ((@DateTimeIn >= DateTimeIn AND @DateTimeIn <= DateTimeOut)  OR (@DateTimeOut >= DateTimeIn AND @DateTimeOut <= DateTimeOut))
)
BEGIN
    RAISERROR ('You already input your effort for the given time range.',16,1)
    RETURN 
END

关于sql - 如何检测 SQL 中两个日期时间之间的重叠?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41259325/

相关文章:

sql - 如何在 SQL Server 的 View 中使用 else-if 条件?

sql - 如何从列中删除第 i 个项目?

sql - 在查询中查找值列表时如何使查询更快?

sql-server - 如何强制安装management studio?

mysql - 合并 2 选择与限制偏移没有关系 SQL

mysql - 如何获得最少的免费约会

SQL 在多个维度的日期范围之间创建日期

sql-server - UPDATE 表中除 TOP 1 记录外的记录

sql-server - 分区上的 row_number

xml - 查询 xml 列的一部分作为结果集