我需要只插入日期到表MONTH_YEAR從01-01-2010到01-01-2040:
例如,我需要在我的表格月份 DATE 上插入記錄:
01-01-2010
01-02-2010
01-03-2010
01-04-2010
01-05-2010
01-06-2010
01-07-2010
01-08-2010
01-09-2010
01-10-2010
01-11-2010
01-12-2010
01-01-2011
01-02-2011
01-03-2011
01-04-2011
01-05-2011
.....................................
01-06-2040
01-07-2040
01-08-2040
01-09-2040
01-10-2040
01-11-2040
01-12-2040
像這樣,我只想將日期插入我的表中,從01-01-2010到01-01-2040
uj5u.com熱心網友回復:
您可以使用分層查詢:
INSERT INTO month_year (column_name)
SELECT ADD_MONTHS(DATE '2010-01-01', LEVEL - 1)
FROM DUAL
CONNECT BY LEVEL <= 31*12;
或者遞回查詢:
INSERT INTO month_year (column_name)
WITH range (dt) AS (
SELECT DATE '2010-01-01' FROM DUAL
UNION ALL
SELECT ADD_MONTHS(dt, 1)
FROM range
WHERE dt < DATE '2040-12-01'
)
SELECT dt FROM range;
db<>在這里擺弄
uj5u.com熱心網友回復:
行生成器是:
SQL> insert into month_year (datum)
2 select date '2010-01-01' level - 1
3 from dual
4 connect by level <= date '2040-01-01' - date '2010-01-01' 1;
10958 rows created.
SQL> select min(datum) min_date,
2 max(datum) max_date
3 from month_year;
MIN_DATE MAX_DATE
---------- ----------
01.01.2010 01.01.2040
SQL>
如果您只需要每個月的第一天,那么
SQL> insert into month_year (datum)
2 select add_months(date '2010-01-01', level - 1)
3 from dual
4 connect by level <= months_between(date '2040-01-01', date '2010-01-01') 1;
361 rows created.
SQL>
uj5u.com熱心網友回復:
您是否真的需要 40 年的日期,這似乎不太可能,或者您可以使用虛擬日歷進行到期,您可以在其中指定 start 和 end_date,然后為您生成所有日期。這個例子每天都在這個范圍內,但可以隨意修改它以產生你需要的東西。我在幾個地方使用它。
CREATE OR REPLACE TYPE nt_date IS TABLE OF DATE;
CREATE OR REPLACE FUNCTION generate_dates_pipelined(
p_from IN DATE,
p_to IN DATE
)
RETURN nt_date PIPELINED DETERMINISTIC
IS
v_start DATE := TRUNC(LEAST(p_from, p_to));
v_end DATE := TRUNC(GREATEST(p_from, p_to));
BEGIN
LOOP
PIPE ROW (v_start);
EXIT WHEN v_start >= v_end;
v_start := v_start INTERVAL '1' DAY;
END LOOP;
RETURN;
END generate_dates_pipelined;
/
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/358153.html
上一篇:按行分組但給出其他行的最高值
