【问题标题】:Get day ranges from date column in SQL从 SQL 中的日期列获取日期范围
【发布时间】:2022-01-15 04:41:38
【问题描述】:

我有一个包含日期列 (date_for) 的表,我想获取此列的连续日期范围。
select
  date_for
from (select to_date('20210910','yyyymmdd') date_for from dual union all
      select to_date('20210911','yyyymmdd') date_for from dual union all
      select to_date('20210912','yyyymmdd') date_for from dual union all
      select to_date('20210913','yyyymmdd') date_for from dual union all
      select to_date('20210915','yyyymmdd') date_for from dual union all
      select to_date('20210916','yyyymmdd') date_for from dual union all
      select to_date('20210917','yyyymmdd') date_for from dual union all
      select to_date('20211011','yyyymmdd') date_for from dual union all
      select to_date('20211012','yyyymmdd') date_for from dual union all
      select to_date('20211108','yyyymmdd') date_for from dual
      )

所需的输出类似于:

2021.09.10-2021.09.13
2021.09.15-2021.09.17
2021.10.11-2021.10.12
2021.11.08-2021.11.08

如何查询?

【问题讨论】:

  • 这能回答你的问题吗? Gaps and Islands Months only
  • 顺便说一下,to_date('20210910','yyyymmdd') 可以更简单地写成date '2021-09-10'
  • @William:是的,但我更喜欢使用 to_char() 函数。当您想使用参数时, to_char 很方便。它适用于世界各地,无论 NLS 设置如何。 :)
  • @lmocsi 不过,这些东西都不适用于这里。您不需要参数,并且 ANSI 日期文字独立于 NLS 领域。

标签: sql oracle range


【解决方案1】:

更简单的解决方案:

select
   min(date_for) st,
   max(date_for) en
from
(select
   date_for,
   date_for-rownum x
 from (select to_date('20210910','yyyymmdd') date_for from dual union all
       select to_date('20210911','yyyymmdd') date_for from dual union all
       select to_date('20210912','yyyymmdd') date_for from dual union all
       select to_date('20210913','yyyymmdd') date_for from dual union all
       select to_date('20210915','yyyymmdd') date_for from dual union all
       select to_date('20210916','yyyymmdd') date_for from dual union all
       select to_date('20210917','yyyymmdd') date_for from dual union all
       select to_date('20211011','yyyymmdd') date_for from dual union all
       select to_date('20211012','yyyymmdd') date_for from dual union all
       select to_date('20211108','yyyymmdd') date_for from dual
       )
 )
group by x
order by 1

【讨论】:

    【解决方案2】:

    您必须隔离岛屿。例如:

    SQL> WITH
      2     test
      3     AS
      4        (SELECT TO_DATE ('20210910', 'yyyymmdd') date_for FROM DUAL
      5         UNION ALL
      6         SELECT TO_DATE ('20210911', 'yyyymmdd') date_for FROM DUAL
      7         UNION ALL
      8         SELECT TO_DATE ('20210912', 'yyyymmdd') date_for FROM DUAL
      9         UNION ALL
     10         SELECT TO_DATE ('20210913', 'yyyymmdd') date_for FROM DUAL
     11         UNION ALL
     12         SELECT TO_DATE ('20210915', 'yyyymmdd') date_for FROM DUAL
     13         UNION ALL
     14         SELECT TO_DATE ('20210916', 'yyyymmdd') date_for FROM DUAL
     15         UNION ALL
     16         SELECT TO_DATE ('20210917', 'yyyymmdd') date_for FROM DUAL
     17         UNION ALL
     18         SELECT TO_DATE ('20211011', 'yyyymmdd') date_for FROM DUAL
     19         UNION ALL
     20         SELECT TO_DATE ('20211012', 'yyyymmdd') date_for FROM DUAL
     21         UNION ALL
     22         SELECT TO_DATE ('20211108', 'yyyymmdd') date_for FROM DUAL)
     23    SELECT MIN (date_for) fie, MAX (date_for) lie
     24      FROM (SELECT date_for,
     25                     TO_NUMBER (TO_CHAR (date_for, 'yyyymmdd'))
     26                   - ROW_NUMBER () OVER (ORDER BY date_for) diff
     27              FROM test)
     28  GROUP BY diff
     29  ORDER BY 1;
    
    FIE        LIE
    ---------- ----------
    2021.09.10 2021.09.13
    2021.09.15 2021.09.17
    2021.10.11 2021.10.12
    2021.11.08 2021.11.08
    
    SQL>
    

    在 OraFAQ 上的 Finding islands 上查看更多选项。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-03-02
      • 2021-10-25
      • 1970-01-01
      • 2014-11-01
      • 1970-01-01
      • 2019-03-29
      相关资源
      最近更新 更多