Oracle SQL。获取两个日期之间的日期

时间:2020-07-08 21:06:50

标签: sql oracle

我有一个带有两个日期列的表,如何获取这两个日期之间的日期并一一列出。这是测试脚本:

CREATE TABLE t1
   AS
      SELECT DATE '2020-1-31' AS startdate,
             DATE '2020-2-3' AS enddate
      FROM dual
      UNION
      SELECT DATE '2020-2-27' AS startdate,
             DATE '2020-3-3' AS enddate
      FROM dual;

SELECT *
FROM t1;


DROP TABLE t1;

我期望的结果是:

enter image description here

我应该如何查询?预先感谢。

3 个答案:

答案 0 :(得分:1)

您在这里:

SQL> select * From t1;

STARTDATE  ENDDATE
---------- ----------
01/31/2020 02/03/2020
02/27/2020 03/03/2020

SQL> select a.startdate, a.enddate,
  2    a.startdate + column_value - 1 dt
  3  from t1 a cross join
  4    table(cast(multiset(select level from dual
  5                        connect by level <= a.enddate - a.startdate + 1
  6                       ) as sys.odcinumberlist))
  7  order by dt;

STARTDATE  ENDDATE    DT
---------- ---------- ----------
01/31/2020 02/03/2020 01/31/2020
01/31/2020 02/03/2020 02/01/2020
01/31/2020 02/03/2020 02/02/2020
01/31/2020 02/03/2020 02/03/2020
02/27/2020 03/03/2020 02/27/2020
02/27/2020 03/03/2020 02/28/2020
02/27/2020 03/03/2020 02/29/2020
02/27/2020 03/03/2020 03/01/2020
02/27/2020 03/03/2020 03/02/2020
02/27/2020 03/03/2020 03/03/2020

10 rows selected.

SQL>

这称为行生成器技术(如果您也想要Google的话)。

答案 1 :(得分:1)

替代解决方案

创建表格-

from io import StringIO

output = """
---------------------------------------------------------------------------
                  |           Up              |         Down              |
  Net     Prefix  |---------------------------+---------------------------
                  |       ASR        |  L     |       A          | Label  |
------------------+------------------+--------+------------------+---------
        1.1.1.1/32|  162.148.102.2:0 |     102|         -        |    -   |
     10.10.40.0/24|  162.148.102.2:0 |     101|         -        |    -   |
        1.1.1.1/32|  162.148.102.2:0 |     100|         -        |    -   |
        3.3.3.3/32|         -        |    -   |  162.148.102.2:0 |     103|
  192.158.104.0/24|         -        |    -   |  162.148.102.2:0 |     105|
        2.2.2.2/32|         -        |    -   |  162.148.102.2:0 |     106|
     10.30.50.0/24|         -        |    -   |  162.148.102.2:0 |     107|

---------------------------------------------------------------------------
"""



a = "1.1.1.1/32"
b = "3.3.3.3/32"
output  = StringIO(output.decode('utf-8'))

for line in output.read().split('\n'):
    if b in line:
      items = line.encode('utf-8').split('|')
      tempa_i = [i.strip() for i in items if i]
      print(tempa_i)

    if a in line:
      items = line.encode('utf-8').split('|')
      tempa_j = [i.strip() for i in items if i]
      print(tempa_j)


# THIS PRINTS:

# ['1.1.1.1/32', '162.148.102.2:0', '102', '-', '-']
# ['1.1.1.1/32', '162.148.102.2:0', '100', '-', '-']
# ['3.3.3.3/32', '-', '-', '162.148.102.2:0', '103']

加载数据-

create table mytable(start_date date, end_date date);

SQL检索给定日期范围内的日期列表-

insert into mytable values (to_date('01/31/2020','mm/dd/yyyy'),to_date('02/03/2020','mm/dd/yyyy'));

db小提琴-https://dbfiddle.uk/?rdbms=oracle_11.2&fiddle=7cd81f5892ad195b72ee1d22a3b44e2a

答案 2 :(得分:1)

对于实际的Oracle版本:

SELECT *
FROM t1,
     lateral(
           select level N,
                  t1.startdate+level-1 dt
           from dual
           connect by level <= t1.enddate - t1.startdate + 1
     );

SELECT 
  startdate,
  enddate,
  startdate+n as DT
FROM t1,
     xmltable('0 to xs:integer(.)' 
              passing cast(enddate-startdate as number)
               columns n int path '.'
             )

完整示例:

with t1
   AS (
      SELECT DATE '2020-1-31' AS startdate,
             DATE '2020-2-3' AS enddate
      FROM dual
      UNION
      SELECT DATE '2020-2-27' AS startdate,
             DATE '2020-3-3' AS enddate
      FROM dual
)
SELECT *
FROM t1,
     lateral(
           select level N,
                  t1.startdate+level-1 dt
           from dual
           connect by level <= t1.enddate - t1.startdate + 1
     );

with t1
   AS (
      SELECT DATE '2020-1-31' AS startdate,
             DATE '2020-2-3' AS enddate
      FROM dual
      UNION
      SELECT DATE '2020-2-27' AS startdate,
             DATE '2020-3-3' AS enddate
      FROM dual
)
SELECT 
  startdate,
  enddate,
  startdate+n as DT
FROM t1,
     xmltable('0 to xs:integer(.)' 
              passing cast(enddate-startdate as number)
               columns n int path '.'
             );