我有一個表,其中包含一個時間戳。我希望每一行都有一個間隔。在下面的示例中,我使用的是 15 分鐘間隔
我的第一個解決方案似乎作業得很好,只是時間戳的小數部分總是 .000000,這是我期望但不想要的。我希望它包含一些其他數字。
在我的第二次嘗試中,我試圖將時間戳的小數部分增加 .100000 這個解決方案的問題是,如果我在示例中創建了許多行(1344),則時間戳的秒部分會增加 1 秒插入 10 行后。請參閱下面的第二個解決方案。我也不想要那個。
第三,我認為也許一個 regexp_replace 解決方案可以作業,我可以切斷第二個解決方案的整數部分(保留小數部分),然后將其添加到我的區間。該嘗試因錯誤而失敗。請參閱下面的第三次嘗試。
有沒有辦法讓這個作業?我可以在不影響日期的 MMDDYYYY HH24:MI:SS 部分的情況下更改時間戳的小數部分。
下面是我的代碼和嘗試以及我希望生成的示例輸出示例。
嘗試 #1 小數部分始終為 .000000
CREATE TABLE t3 (
seq_num NUMBER GENERATED BY DEFAULT AS IDENTITY (START WITH 1) NOT NULL,
dt TIMESTAMP );
/
INSERT into t3 (dt)
with dt (dt, interv) as (
select timestamp '2022-01-01 00:00:00',
numtodsinterval(15,'MINUTE') from dual
union all
select dt.dt interv, interv from dt
where dt.dt interv < date '2022-01-15')
select dt from dt;
/
SELECT * FROM T3 ORDER BY SEQ_NUM
SEQ_NUM DT
1 01-JAN-22 12.00.00.000000 AM
2 01-JAN-22 12.15.00.000000 AM
3 01-JAN-22 12.30.00.000000 AM
4 01-JAN-22 12.45.00.000000 AM
5 01-JAN-22 01.00.00.000000 AM
6 01-JAN-22 01.15.00.000000 AM
…
...
1342 14-JAN-22 11.15.00.000000 PM
1343 14-JAN-22 11.30.00.000000 PM
1344 14-JAN-22 11.45.00.000000 PM
嘗試 #2 注意到 seq_num 1355 處的秒數變化。它從 :00 變為 :01
TRUNCATE TABLE T3;
/
INSERT into t3 (dt)
with dt (dt, interv) as (
select timestamp '2022-01-01 00:00:00',
numtodsinterval(15,'MINUTE')
numtodsinterval( (rownum * .100000), 'SECOND') from dual
union all
select dt.dt interv, interv from dt
where dt.dt interv < date '2022-01-15')
select dt from dt;
/
SELECT * FROM T3 ORDER BY SEQ_NUM
SEQ_NUM DT
1345 01-JAN-22 12.00.00.000000 AM
1346 01-JAN-22 12.15.00.100000 AM
1347 01-JAN-22 12.30.00.200000 AM
1348 01-JAN-22 12.45.00.300000 AM
1349 01-JAN-22 01.00.00.400000 AM
1350 01-JAN-22 01.15.00.500000 AM
1351 01-JAN-22 01.30.00.600000 AM
1352 01-JAN-22 01.45.00.700000 AM
1353 01-JAN-22 02.00.00.800000 AM
1354 01-JAN-22 02.15.00.900000 AM
1355 01-JAN-22 02.30.01.000000 AM
1356 01-JAN-22 02.45.01.100000 AM
…
…
嘗試 #3 失敗
TRUNCATE TABLE T3;
/
INSERT into t3 (dt)
with dt (dt, interv) as (
select timestamp '2022-01-01 00:00:00',
numtodsinterval(15,'MINUTE')
regexp_replace(
numtodsinterval( (rownum * .100000), 'SECOND'), '[^.] \.(.*)$', '0.\1') from dual
union all
select dt.dt interv, interv from dt
where dt.dt interv < date '2022-01-15')
select dt from dt;
/
ORA-30081: invalid data type for datetime/interval arith
期望的輸出
SEQ_NUM DT
1345 01-JAN-22 12.00.00.000000 AM
1346 01-JAN-22 12.15.00.100000 AM
1347 01-JAN-22 12.30.00.200000 AM
1348 01-JAN-22 12.45.00.300000 AM
1349 01-JAN-22 01.00.00.400000 AM
1350 01-JAN-22 01.15.00.500000 AM
1351 01-JAN-22 01.30.00.600000 AM
1352 01-JAN-22 01.45.00.700000 AM
1353 01-JAN-22 02.00.00.800000 AM
1354 01-JAN-22 02.15.00.900000 AM
1355 01-JAN-22 02.30.00.000000 AM
1356 01-JAN-22 02.45.00.100000 AM
1357 01-JAN-22 03.00.00.200000 AM
…
…
uj5u.com熱心網友回復:
您可以使用:
INSERT into t3 (dt)
SELECT TIMESTAMP '2022-01-01 00:00:00'
(LEVEL - 1) * INTERVAL '15' MINUTE
MOD(LEVEL - 1, 10) * INTERVAL '0.1' SECOND
FROM DUAL
CONNECT BY
TIMESTAMP '2022-01-01 00:00:00'
(LEVEL - 1) * INTERVAL '15' MINUTE
MOD(LEVEL - 1, 10) * INTERVAL '0.1' SECOND < DATE '2022-01-15';
或者:
INSERT into t3 (dt)
SELECT TIMESTAMP '2022-01-01 00:00:00'
NUMTODSINTERVAL((LEVEL-1)*15*60 MOD(LEVEL-1, 10)/10, 'SECOND')
FROM DUAL
CONNECT BY
TIMESTAMP '2022-01-01 00:00:00'
NUMTODSINTERVAL((LEVEL-1)*15*60 MOD(LEVEL-1, 10)/10, 'SECOND')
< DATE '2022-01-15';
兩者都給出了值:
SEQ_NUM DT 1 2022-01-01 00:00:00.000000 2 2022-01-01 00:15:00.100000 3 2022-01-01 00:30:00.200000 4 2022-01-01 00:45:00.300000 5 2022-01-01 01:00:00.400000 6 2022-01-01 01:15:00.500000 7 2022-01-01 01:30:00.600000 8 2022-01-01 01:45:00.700000 9 2022-01-01 02:00:00.800000 10 2022-01-01 02:15:00.900000 11 2022-01-01 02:30:00.000000
db<>在這里擺弄
uj5u.com熱心網友回復:
看起來您只想添加 15 分 0.1 秒的間隔
select level seq_num,
timestamp '2022-01-01 00:00:00'
(level-1) * interval '15' minute
(level-1) * interval '0.1' second dt
from dual
connect by level <= 10
這是一個 dbfiddle,顯示它產生了您想要的輸出。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/414317.html
標籤:
上一篇:用10億條記錄更新emp_id列
