获取两个日期范围(在列中)之间的重叠日期 - 无需创建数据库对象

Get overlapping dates between two date ranges (in columns) - WITHOUT creating database objects

我在 Microsoft SQL Server 2016 中遇到了一个棘手的情况,我需要获取员工休假 (LOA) 的日期列表) 在 PayPeriod 中,具有固定的 PeriodStart 和固定的 PeriodEnd 列。

见下图(源数据集):

我在数据集的 5 行中有 4 个员工。

PeriodStart 和 PeriodEnd 始终固定,值分别为 Dec 15 和 Dec 22(2020 年)。我在不同的列中有每个员工的 LOA 开始日期和 LOA 结束日期。源数据集在任何给定时间都只有一组 PeriodStart 和 PeriodEnd 日期。比如说,在上述情况下,始终是 12 月 15 日和 12 月 22 日。在其他一些情况下,它将是 12 月 22 日和 12 月 29 日。但在给定时间只有一个范围。源数据集不能包含员工 X 的 Dec 15 - Dec 22 和员工 Y 的 Dec 22 - Dec 29。

期望的输出如下:

这里的挑战是,我正在使用我们客户的查询生成器,不能 使用 T-SQL 对象,例如作为临时 tables (#)、Table 变量 (@)、通用 Table 表达式 (CTE)、用户定义函数甚至视图。

这是纯粹的临时报告,您只能在其中创建派生的tables(或子查询)并具有别名并将其用作数据集.这样的数据集可用于 JOIN 和其他常规内容。

例如:

SELECT a, b

FROM

(SELECT t1.a, t2.b
FROM table1 t1
INNER JOIN table2 t2
ON t1.ID = t2.ID) XYZ

派生的 table(或子查询)XYZ 是我的主要数据集。

我需要将所需的输出别名为 XYZ。

谁能帮我实现这个?

SELECT
  yourTable.EmployeeID,
  DATEADD(DAY, calendar.date_id, yourTable.PeriodStart)
FROM
(
  SELECT
    ROW_NUMBER() OVER (ORDER BY the_primary_key) - 1 AS date_id    
  FROM
    any_big_enough_table
)
  AS calendar
INNER JOIN
  yourTable
    ON  calendar.date_id <= DATEDIFF(DAY, yourTable.PeriodStart, yourTable.PeriodEnd)
    AND calendar.date_id >= DATEDIFF(DAY, yourTable.PeriodStart, yourTable.LOAStartDate)
    AND calendar.date_id <= DATEDIFF(DAY, yourTable.PeriodStart, yourTable.LOAEndDate)

请原谅打字错误,我在 phone.