获取两个日期范围(在列中)之间的重叠日期 - 无需创建数据库对象
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.
我在 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.