如何在SQL Server中的查询中创建日期表?

如何在SQL Server中的查询中创建日期表?,sql,sql-server,datetime,recursive-query,sql-server-2017,Sql,Sql Server,Datetime,Recursive Query,Sql Server 2017,假设我想将表_a中的开始日期和结束日期分别与各个日期匹配,并查看表_a中的一条或多条记录是否匹配,例如3月13日。我想通过每天生成一行来解决这个问题,其中日期作为前导列,表_a中的任何匹配数据作为左联接 我曾经使用过具有日期维度的数据仓库,这些数据仓库使这项工作变得简单。但不幸的是,我需要在没有这样一个表的OLTP数据库上运行这个特定的查询 如何在SQL Server中生成每日行表?在没有临时表、函数/过程等的情况下,我如何在查询中做到这一点?我找到了一种简单的方法来做到这一点。我假设您的dat

假设我想将表_a中的开始日期和结束日期分别与各个日期匹配,并查看表_a中的一条或多条记录是否匹配,例如3月13日。我想通过每天生成一行来解决这个问题,其中日期作为前导列,表_a中的任何匹配数据作为左联接

我曾经使用过具有日期维度的数据仓库,这些数据仓库使这项工作变得简单。但不幸的是,我需要在没有这样一个表的OLTP数据库上运行这个特定的查询


如何在SQL Server中生成每日行表?在没有临时表、函数/过程等的情况下,我如何在查询中做到这一点?

我找到了一种简单的方法来做到这一点。我假设您的dates表中有两年的日期就足够了

现在,在您的数据库中找到一个至少有800条记录的表365 x 2+闰年-这是将365=~~800相乘的一个难题。问题涉及从表a中选择数据,因此我们假设这是表b。然后,在查询顶部创建此公共表表达式:

with dates_table as (
    select top 800  -- or more/less if your timespan isn't ~2years
        [date] = date_add(day, ROW_NUMBER() over (order by <random column>) -1, <your-start-date>)
    from table_b
)

select d.[date]
, a.<whatever>
from dates_table d
left outer join table_a a on <join / date matching here>
-- where etc, etc, etc
一些注意事项:

这只需要获取数字0-799并将其添加到任意日期即可。 如果您需要的日期多于或少于两年,请增加或减少顶部报表中的数字。确保表_b有足够的行:从表_b中选择count*。
我找到了一个简单的方法。我假设您的dates表中有两年的日期就足够了

现在,在您的数据库中找到一个至少有800条记录的表365 x 2+闰年-这是将365=~~800相乘的一个难题。问题涉及从表a中选择数据,因此我们假设这是表b。然后,在查询顶部创建此公共表表达式:

with dates_table as (
    select top 800  -- or more/less if your timespan isn't ~2years
        [date] = date_add(day, ROW_NUMBER() over (order by <random column>) -1, <your-start-date>)
    from table_b
)

select d.[date]
, a.<whatever>
from dates_table d
left outer join table_a a on <join / date matching here>
-- where etc, etc, etc
一些注意事项:

这只需要获取数字0-799并将其添加到任意日期即可。 如果您需要的日期多于或少于两年,请增加或减少顶部报表中的数字。确保表_b有足够的行:从表_b中选择count*。
另一种方法是递归查询以生成日期序列。根据您的伪代码:

with dates_table as (
    select <your-start-date> dt
    union all
    select dateadd(day, 1, dt) from dates_table where dt < <your-end-date>
)
select d.dt, a.<whatever>
from dates_table d
left outer join table_a a on <join / date matching here>
-- where etc etc
option (maxrecursion 0)

另一种方法是递归查询以生成日期序列。根据您的伪代码:

with dates_table as (
    select <your-start-date> dt
    union all
    select dateadd(day, 1, dt) from dates_table where dt < <your-end-date>
)
select d.dt, a.<whatever>
from dates_table d
left outer join table_a a on <join / date matching here>
-- where etc etc
option (maxrecursion 0)

1如果您只关心一个似乎是您的问题的日期,则不需要生成所有日期。2如果您只想重叠,甚至不需要生成所有日期。你可以考虑用样本数据和期望的结果来问一个新问题。同时,GMB的答案比你的答案更符合你的意愿。@GordonLinoff 1我想要一份所有日期的列表,可能还有表a中的匹配数据。这就是问题的内容,也是目前存在的两个答案。2“更好”不仅是主观的,还可以使用上下箭头表示。你对这一点的确切意思是什么。它比较短。它更简洁。它精确地生成所需的日期。对我来说似乎更好。1如果您只关心一个似乎是您的问题的日期,则不需要生成所有日期。2如果您只想重叠,甚至不需要生成所有日期。你可以考虑用样本数据和期望的结果来问一个新问题。同时,GMB的答案比你的答案更符合你的意愿。@GordonLinoff 1我想要一份所有日期的列表,可能还有表a中的匹配数据。这就是问题的内容,也是目前存在的两个答案。2“更好”不仅是主观的,还可以使用上下箭头表示。你对这一点的确切意思是什么。它比较短。它更简洁。它精确地生成所需的日期。我觉得好多了。