2017-02-20 13 views
-1
 
ID Date  NAME START_TIME    END_TIME    
1 2/15/2017 A  2/15/20173:40:39 PM  2/15/2017 3:41:17 PM 
2 2/15/2017 B  2/15/20173:40:39 PM  2/15/2017 3:41:17 PM 
3 2/15/2017 C  2/15/20173:40:39 PM  2/15/2017 3:41:17 PM  

Ich habe ein Problem, wo ich meine Datenbank mit diesen 3 Aussagen von Januar 2016 bis heute füllen muss. Eine Lösung, die ich ausprobieren kann, ist, dass ich Java-Code schreiben kann, der einfach aufschleifen und ein neues Datum und einen neuen Eintrag für die Tabelle erstellen kann, und dann kann ich mithilfe der generierten Abfrage einfügen.Füllen Sie Daten in Tabelle mit Oracle

Aber gibt es eine Möglichkeit, die ich mit Orakel tun kann.

+2

Sind MySQL oder Oracle Sie? (Nicht gekennzeichnete Produkte nicht kennzeichnen.) – jarlh

+0

Eine Zeile pro Tag für jedes von A, B und C? Mit welchen Anfangs- und Endzeiten? –

+0

@jarlh ich benutze Orakel. – rkSinghania

Antwort

0

Als Grundkonzept, würde so etwas tun ... Sie müssten entweder für die A, B und C anpassen, oder für jede wiederholen.

with Numbers (NN) as 
(
select 1 as NN 
from dual 
union all 
select NN+1 
from Numbers 
where NN <2000 
) 
insert into MyTable (ID, Date, Name, StartTime, EndTime) 
select NN + 3, -- If repeating, replace the 3 with the max(id) after each run 
     'A', 
     to_date('20170215','YYYYMMDD') - NN, 
     to_date('20170215 154039','YYYYMMDD HH24MISS') - NN, 
     to_date('20170215 154117','YYYYMMDD HH24MISS') - NN 
from NN 
where NN <= 365 
+0

Die Ausnahmebedingung PLS-00182: Bezeichner darf keine leere Zeichenfolge sein – rkSinghania

1

Dies ist eine häufig verwendete Art und Weise Daten ein Start- und ein Enddatum angegeben zu erzeugen, die Sie einfach auf die Liste Ihrer Namen beitreten können zu bekommen, was Sie brauchen:

insert into yourTable (...)  
with names as (
    select 'A' as name from dual union all 
    select 'B' as name from dual union all 
    select 'C' as name from dual 
), 
dates as (
      select date' 2017-01-01' + level -1 as yourDate 
      from dual 
      connect by date' 2016-01-01' + level -1 <= date '2017-02-20' 
     ) 
select rownum, name, yourDate 
from names 
     cross join dates 

Dies hat leicht bearbeitet werden, um der Anzahl und den Arten Ihrer Spalten besser zu entsprechen. Ein kleines Beispiel dafür, wie es funktioniert:

with names as (
    select 'A' as name from dual union all 
    select 'B' as name from dual union all 
    select 'C' as name from dual 
), 
dates as (
      select date' 2017-02-18' + level -1 as yourDate, 
      level as lev 
      from dual 
      connect by date' 2017-02-18' + level -1 <= date '2017-02-20') 
select rownum, name, yourDate, lev 
from names 
     cross join dates 

gibt:

ROWNUM N YOURDATE   LEV 
---------- - --------- ---------- 
     1 A 18-FEB-17   1 
     2 B 18-FEB-17   1 
     3 C 18-FEB-17   1 
     4 A 19-FEB-17   2 
     5 B 19-FEB-17   2 
     6 C 19-FEB-17   2 
     7 A 20-FEB-17   3 
     8 B 20-FEB-17   3 
     9 C 20-FEB-17   3 
Verwandte Themen