【问题标题】:How to count whether a date is within two dates in SQL?SQL中如何计算一个日期是否在两个日期之内?
【发布时间】:2021-03-19 05:21:42
【问题描述】:

我有一个如下所示的表格:

Account # Open Date Close Date
123 01/01/2018 04/04/2019
234 01/03/2018 03/04/2018

我正在尝试创建一个统计年底未结帐户的表格,如下所示:

Year End of Year Date # of Open Accounts
2018 12/31/2018 1

我还有一张带有规范日期的表格,它只是一张装满日期的巨型表格。有许多帐户具有许多打开和关闭日期。开放日期早在 2001 年,关闭日期截至今天(包括今天)。一个帐户只能有一个开放日期,而不能有一个关闭日期 - 在这种情况下,它将被计为当年的开放日期。

使用 SQL 实现此目的的好方法是什么?

【问题讨论】:

  • 用您正在使用的数据库标记您的问题。
  • 在哪里cast('20181231' as date) between <opendate> and <closedate>
  • 带有规范日期的表格是什么样的?
  • 您只想计算 2018 年专门开设但没有关闭日期的帐户?
  • Canonical Date 表记录了从 2000 年到 2025 年的每个日期,并且有年、月、星期几、月中日、年中周、年中日等。

标签: sql datetime count inner-join snowflake-cloud-data-platform


【解决方案1】:

这是你想要的吗?

select v.year, v.eoy_date, count(*)
from (values ('2018', date '2018-12-31') as v(year, eoy_date) left join
     t
     on open_date <= v.eoy_date and close_date > v.eoy_date
group by v.year, v.eoy_date;

【讨论】:

  • 它需要在 2018 年之后变化。我们会看到从 2000 年到今天的日期。一个帐户可以在 2018 年开设,并且关闭日期为空……在这种情况下,它将被计算为 2018 年和 2019 年。
  • @MagicalOrange 。 . .只需在 values() 派生表构造函数中添加更多行。
【解决方案2】:

您可以加入规范日期表并聚合:

select d.year, d.end_of_year_date, count(distinct t.account#) as cnt_open_accounts
from (
    select d.*, max(d.date) over(partition by d.year) as end_of_year_date
    from canonicaldate d
) d
inner join mytable t on d.date between t.open_date and t.close_date
group by d.year, d.end_of_year_date

【讨论】:

    猜你喜欢
    • 2022-08-15
    • 2021-11-26
    • 1970-01-01
    • 2013-04-11
    • 1970-01-01
    • 2013-03-30
    • 2017-09-14
    • 2011-07-24
    • 2011-11-25
    相关资源
    最近更新 更多