【问题标题】:How to check that given time slot is already exists in SQL Server 2012如何检查 SQL Server 2012 中是否已存在给定的时间段
【发布时间】:2017-01-05 07:19:28
【问题描述】:

我想检查给定的开始时间和结束时间是否在 SQLServer 2012 的开始时间和结束时间之间。

案例:我有一个表格,它有两列开始时间和结束时间,两行,请看下面是我的表格

StartTime | EndTime

10:00:00  | 17:00:00 

17:30:00  | 18:30:00

案例 1 :给定开始时间是 '10:05:00' 和结束时间是 '16:00:00' 那么它应该返回 '10:00:00' 和 '17: 00:00'。

案例 2 :给定开始时间是 '09:05:00' 和结束时间是 '16:00:00' 那么它应该返回 '10:00:00' 和 '17: 00:00'。

案例 3 :给定开始时间是 '09:05:00' 和结束时间是 '17:15:00' 那么它应该返回 '10:00:00' 和 '17: 00:00'。

案例 4 :给定开始时间是 '23:05:00' 和结束时间是 '17:15:00' 那么它应该返回 '10:00:00' 和 '17: 00:00'。

案例 5 :给定开始时间是 '10:05:00' 和结束时间是 '17:15:00' 那么它应该返回 '10:00:00' 和 '17: 00:00'。

案例 6:给定开始时间是 '17:00:00' 和结束时间是 '17:30:00' 那么它不应该返回任何东西。

【问题讨论】:

  • 您为什么不简单地从数据库中“按原样”获取日期,然后在您的 C# 代码中进行量化?
  • 向我们展示您的尝试
  • 我听不清楚。 @罗伯特
  • Select Count(*) from table_name where (((StartTime between '23:05:00' AND '17:00:00') OR (ENDTime between '23:05:00' AND ') 17:00:00'))OR ((StartTime AND ENDTime 之间的'23:05:00') OR (StartTime AND ENDTime 之间的'17:00:00')))

标签: c# asp.net sql-server datetime


【解决方案1】:

所以你想返回与参数描述的时间段重叠的记录,对吧? 好吧,这是一种方法:

创建并填充示例表(在您以后的问题中保存我们这一步)

DECLARE @T as Table
(
    StartTime time,
    EndTime time
)

INSERT INTO @T VALUES
('10:00:00', '17:00:00'),
('17:30:00', '18:30:00')

声明和填充查询变量:

DECLARE @StartTime time, @EndTime time

SELECT  @StartTime = '23:05:00', 
        @EndTime = '17:00:00'

查询:

SELECT *
FROM @T 
WHERE 
(
    StartTime < @EndTime
    AND EndTime > CASE WHEN @StartTime > @EndTime THEN '00:00:00' ELSE @StartTime END
)
OR
(
    -- both periods must overlap since they both include '00:00:00'     
    @StartTime > @EndTime
    AND StartTime > EndTime
)
OR
(
    @StartTime < @EndTime
    AND StartTime > EndTime
    AND EndTime > @StartTime        
)

结果:

StartTime   EndTime
10:00:00    17:00:00

注意:我已经考虑到时间段可能包括两个不同的日子。

【讨论】:

  • 除案例 6 外,所有案例都可以正常工作。在执行案例 6 时,它不应返回任何内容,因为该插槽是空闲的。你能帮我实现这个解决方案吗?
  • 这是什么意思“请在您以后的问题中保存我们这一步”?
  • 这意味着在您以后的问题中,您应该将示例数据提供为 DDL + DML 语句,以便任何想要回答问题的人都可以轻松地将其复制到自己的环境中并使用它。跨度>
  • 我会听从你的建议
  • 上述查询出错
猜你喜欢
  • 2010-11-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-13
相关资源
最近更新 更多