微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

说我想将table_a中具有startdateenddate的记录与各天进行匹配,以查看是否在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 举报,一经查实,本站将立刻删除。