Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 获取两个日期范围(列中)之间的重叠日期-无需创建数据库对象_Sql Server_Date_Tsql_Overlapping_Adhoc Queries - Fatal编程技术网

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

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

在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、用户定义函数甚至视图

这是纯粹的即席报告,您只能创建派生表或子查询,并使用别名作为数据集。这样的数据集可以用于连接和其他常规内容

例如:

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之间的任何一个表中包含的行数都超过它的天数。但是,在你试图解决可能不存在的问题之前,先尝试一下;在这种情况下,我将使用其他一些具有大量行的表。谢谢你的澄清,非常感谢;它适用于此数据集。谢谢。我将在我的客户端应用程序中尝试,希望一旦成功,我会将您的解决方案标记为答案。