请不要批评我这个问题,因为它已经简化了。
让我们假设我的表格CALENDAR
包含两列:CLIENT_ID (INTEGER)
和ENTRY_DATE(DATE)
以及此数据:
+----------------------------+
| CLIENT_ID | ENTRY_DATE |
+-----------+----------------+
| 100 | 2012-01-03 |
| 100 | 2012-01-23 |
+-----------+----------------+
如何使用内联INSERT
个缺失日期?
答案 0 :(得分:1)
生成日期并离开加入日历。
select
nvl(calendar.client_id,100),
dt.day as entry_date
from (select to_date('1-Jan-2012','dd-mon-yyyy')+level-1
from dual connect by level<=366
) dt
left join Calendar
on (calendar.entry_date=dt.day and client_id = 100)
答案 1 :(得分:1)
此查询将为所有客户端插入日历空洞:
INSERT INTO calendar (client_id, entry_date) (
SELECT holes.client_id, holes.hole
FROM (
SELECT cal.client_id, cal.mn + level AS hole
FROM (
SELECT client_id, MIN(entry_date) AS mn, MAX(entry_date) AS mx
FROM calendar
GROUP BY client_id
HAVING MAX(entry_date)>MIN(entry_date)+1
) cal
CONNECT BY cal.mn + level < cal.mx
GROUP BY cal.client_id, cal.mn + level
) holes LEFT OUTER JOIN calendar c ON holes.client_id = c.client_id AND c.entry_date = hole
WHERE
c.entry_date IS NULL
)
答案 2 :(得分:0)
也许这有帮助 - Oracle查询。您需要弄清楚如何比较您的日期并仅插入缺少的日期。开始日期是您的输入日期。其余的是......:
-- Annual table by date and ISO week - use WW format for non-iso week--
SELECT start_date
, TRUNC(start_date, 'iw') wk_starts
, TRUNC(start_date, 'iw') + 7 - 1/86400 wk_ends
, TO_NUMBER (TO_CHAR (start_date, 'IW')) ISO_wk#_iw
FROM
(
SELECT TRUNC(SYSDATE, 'YEAR')-1 + LEVEL AS start_date -- 11/1/2013 --
FROM dual
CONNECT BY LEVEL <=
(-- Number of Days in curr year = 365 --
SELECT TRUNC(ADD_MONTHS (SYSDATE, 12), 'Y')-TRUNC(SYSDATE, 'Y')
FROM dual
)
)
/
SQL>
START_DATE WK_STARTS WK_ENDS ISO_WK#_IW
--------------------------------------------------------------
1/1/2013 12/31/2012 1/6/2013 11:59:59 PM 1
1/2/2013 12/31/2012 1/6/2013 11:59:59 PM 1
....
1/14/2013 1/14/2013 1/20/2013 11:59:59 PM 3
1/15/2013 1/14/2013 1/20/2013 11:59:59 PM 3
....
12/29/2013 12/23/2013 12/29/2013 11:59:59 PM 52
12/30/2013 12/30/2013 1/5/2014 11:59:59 PM 1
12/31/2013 12/30/2013 1/5/2014 11:59:59 PM 1
答案 3 :(得分:0)
基于FlorinGhita回答:
SELECT 100, TO_DATE('2012-01-03', 'YYYY-MM-DD') + LEVEL
FROM DUAL
CONNECT BY LEVEL < TO_DATE('2012-01-23', 'YYYY-MM-DD') - TO_DATE('2012-01-03', 'YYYY-MM-DD')