如何解决如何在SQL Server中的查询中创建日期表?
说我想将table_a
中具有startdate
和enddate
的记录与各天进行匹配,以查看是否在3月13日,例如{{ 1}}匹配。我想通过每天生成一行,以日期为前导列,并将来自table_a
的所有匹配数据作为table_a
来解决此问题。
我使用的数据仓库的尺寸为left join
,可以使这项工作变得容易。但不幸的是,我需要在没有此类表的OLTP数据库上运行此特定查询。
如何在sql Server中生成每天的行表?在没有临时表,函数/过程等的情况下,如何在查询中执行此操作?
解决方法
另一种方法是递归查询以生成日期序列。根据您的伪代码:
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)
,
我发现了一些破解方法。我假设您的date
表中有两年的日期就足够了。
现在,在数据库中找到一个至少有800条记录的表(365 x 2 + years年-365乘以~~ 800令人头疼)。该问题涉及从dates
中选择数据,因此我们假设这是table_a
。然后,在查询顶部创建此通用表表达式:
table_b
一些注意事项:
- 通过获取数字0-799并将其添加到任意日期即可。
- 如果您需要多于或少于两年的日期,请增加或减少
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
语句中输入的数字。确保top
有足够的行:table_b
。 -
select count(*) from table_b
可以是<random column
上的任何列,顺序无关紧要。我们只对数字1-800(-1表示0-799的范围)感兴趣,但是table_b
需要一个ROW_NUMBER
参数。 -
order by
在日期表中具有您想要的第一个日期,并包含在输出中。 - 在联接查询的
<your-start-date>
中,您可以通过添加where
之类的内容来获取800行而不是730行(+跳),从而过滤掉超出的任何多余天数。 - 如果
year(d.[date]) IN (2020,2021)
本身具有800条以上的记录,则可以将其用作table_a
的基础,而不是其他一些表。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。