Sql server 获取两个日期范围(列中)之间的重叠日期-无需创建数据库对象
在Microsoft SQL Server 2016中,我遇到了一个棘手的情况,我需要获取员工在发薪期内休假LOA的日期列表,其中包含固定的周期开始和固定的周期结束列 请参见源数据集的下图: 我在数据集的5行中有4名员工 PeriodStart和PeriodEnd始终是固定的,2020年的值分别为Dec 15和Dec 22。我将每位员工的LOA开始日期和LOA结束日期分别列在不同的列中。在任何给定时间,源数据集只有一组PeriodStart和PeriodEnd日期。比如说,在上述情况下,总是12月15日和22日。在其他一些情况下,将是12月22日和29日。但在给定时间只有一个范围。源数据集不能包含员工X的12月15日至22日,员工Y的12月22日至29日 所需输出如下: 这里的挑战是,我使用的是客户机的查询生成器,它不能使用T-SQL对象,例如临时表、表变量@、公共表表达式CTE、用户定义函数甚至视图 这是纯粹的即席报告,您只能创建派生表或子查询,并使用别名作为数据集。这样的数据集可以用于连接和其他常规内容 例如:Sql server 获取两个日期范围(列中)之间的重叠日期-无需创建数据库对象,sql-server,date,tsql,overlapping,adhoc-queries,Sql Server,Date,Tsql,Overlapping,Adhoc Queries,在Microsoft SQL Server 2016中,我遇到了一个棘手的情况,我需要获取员工在发薪期内休假LOA的日期列表,其中包含固定的周期开始和固定的周期结束列 请参见源数据集的下图: 我在数据集的5行中有4名员工 PeriodStart和PeriodEnd始终是固定的,2020年的值分别为Dec 15和Dec 22。我将每位员工的LOA开始日期和LOA结束日期分别列在不同的列中。在任何给定时间,源数据集只有一组PeriodStart和PeriodEnd日期。比如说,在上述情况下,总是12
SELECT a, b
FROM
(SELECT t1.a, t2.b
FROM table1 t1
INNER JOIN table2 t2
ON t1.ID = t2.ID) XYZ
派生表或子查询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)
请原谅我的打字错误,我正在打电话。老实说,你最好用.Net而不是tsql来标记这个问题,因为你在问题中明确表示你不能直接编写T-SQL语句。这只是T-SQL编码;很抱歉造成混乱;查询生成器是在.Net中创建的。我需要一个100%的T-SQL解决方案,不需要创建数据库对象。这样就不会有打字错误的问题。我不确定我们是否可以在查询生成器中使用系统表。查询生成器有很多限制。是否可以删除系统表?我甚至不使用模式为dbo.X的表名,而是使用模式为X的表名。您只需要在PeriodStart和PeriodEnd之间的任何一个表中包含的行数都超过它的天数。但是,在你试图解决可能不存在的问题之前,先尝试一下;在这种情况下,我将使用其他一些具有大量行的表。谢谢你的澄清,非常感谢;它适用于此数据集。谢谢。我将在我的客户端应用程序中尝试,希望一旦成功,我会将您的解决方案标记为答案。