【问题标题】:Find conflicts between date and time using SQL server 2012使用 SQL Server 2012 查找日期和时间之间的冲突
【发布时间】:2019-09-05 09:15:38
【问题描述】:

我在这里有这个表,其中包含 startDate、endDate、startTime 和 endTime 列。

startDate   endDate     startTime  endTime
2020-01-01  2020-01-02  13:00:00   11:00:00
2020-01-14  2020-01-14  08:00:00   16:00:00
2020-02-01  2020-03-01  12:00:00   12:00:00

我也得到了这组新数据:

startDate   endDate     startTime  endTime
2020-01-12  2020-01-15  13:00:00   11:00:00
2020-01-29  2020-02-10  08:00:00   16:00:00

如何检查新数据集是否与表中已有的日期和时间有冲突?我还可以从表格中获取日期和时间列表吗?

更新 - 我已经尝试过将 startDate 和 startTime 组合成一个新列作为 startDateTime ,它将保存 datetime 数据类型,所以我可以在 between 语句中使用来检查它,但我似乎无法将这两列组合在一起。

【问题讨论】:

  • 你的意思是,如果日期时间范围是overlapping?
  • “我也可以从表格中获取日期和时间列表吗?” 可以,通过SELECT
  • 是的,我的意思是重叠。
  • 我的意思是我需要与新数据重叠的字段

标签: sql-server


【解决方案1】:

使用连接试试这个选项。这将只返回新数据集中有冲突的行。

WITH your_table(startDate,endDate,startTime,endTime)
AS
(
    SELECT '2020-01-01','2020-01-02','13:00:00','11:00:00' UNION ALL
    SELECT '2020-01-14','2020-01-14','08:00:00','16:00:00' UNION ALL
    SELECT '2020-02-01','2020-03-01','12:00:00','12:00:00'
),
new_data_set(startDate,endDate,startTime,endTime)
AS
(
    SELECT '2020-01-12','2020-01-15','13:00:00','11:00:00' UNION ALL
    SELECT '2020-01-29','2020-02-10','08:00:00','16:00:00'
)

SELECT A.*
FROM new_data_set A
INNER JOIN your_table B 
ON  CAST(A.startDate+' '+A.startTime AS DATETIME)
    BETWEEN CAST(B.startDate+' '+B.startTime AS DATETIME)
    AND CAST(B.endDate+' '+B.endTime AS DATETIME)

    OR  

    CAST(A.endDate+' '+A.endTime AS DATETIME)
    BETWEEN CAST(B.startDate+' '+B.startTime AS DATETIME)
    AND CAST(B.endDate+' '+B.endTime AS DATETIME)


    OR 
    (
        CAST(A.startDate+' '+A.startTime AS DATETIME) <  CAST(B.startDate+' '+B.startTime AS DATETIME)
        AND
        CAST(A.endDate+' '+A.endTime AS DATETIME) >   CAST(B.endDate+' '+B.endTime AS DATETIME)
    )

输出是-

startDate   endDate     startTime   endTime
2020-01-12  2020-01-15  13:00:00    11:00:00
2020-01-29  2020-02-10  08:00:00    16:00:00

【讨论】:

  • 谢谢,但输出应该是两行,因为它们都是冲突的。
  • @hussainsajid 又添加了一个条件。请检查。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-15
  • 2011-12-01
  • 1970-01-01
  • 2013-09-09
  • 2017-04-22
  • 2013-05-06
相关资源
最近更新 更多