我有一个带有两个日期列的表,如何获取这两个日期之间的日期并一一列出。这是测试脚本:
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;
我期望的结果是:
我应该如何查询?预先感谢。
答案 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 '.'
);