Twoje PC  
Zarejestruj się na Twoje PC
TwojePC.pl | PC | Komputery, nowe technologie, recenzje, testy
B O A R D
   » Board
 » Zadaj pytanie
 » Archiwum
 » Szukaj
 » Stylizacja

 
M E N U
  0
 » Nowości
0
 » Archiwum
0
 » Recenzje / Testy
0
 » Board
0
 » Rejestracja
0
0
 
Szukaj @ TwojePC
 

w Newsach i na Boardzie
 
OBECNI NA TPC
 
 » piszczyk 01:43
 » Chavez 01:26
 » Chrisu 01:25
 » metacom 01:21
 » Martens 01:17
 » BoloX 01:16
 » Dzban 01:02
 » Qjanusz 00:53
 » Irys 00:51
 » ulan 00:41
 » RaPToRR 00:22
 » zibi13 00:10
 » esteban 23:52
 » alkatraz 23:48
 » Menah 23:36
 » luckyluc 23:27
 » Wolf 23:25
 » selves 23:24
 » wrrr 23:24
 » fiskomp 23:14

 Dzisiaj przeczytano
 36873 postów,
 wczoraj 25433

 Szybkie ładowanie
 jest:
włączone.

 
ccc
TwojePC.pl © 2001 - 2025
A R C H I W A L N A   W I A D O M O Ś Ć
    

SQL/Oracle - jak wygenerować daty od 1 stycznia do 31 grudnia ? , JE Jacaw 26/11/10 14:54
Tzn. chodzi o takie coś, jest np. zbiór zawierający daty zakupu i wartość zakupu (tabela zakupy) i teraz chce zrobić zestawienie, które będzie pokazywało wartość zakupu w każdym dniu roku, łącznie z dniami, które nie występują w tabeli zakupy.

Przykładowo mamy w tabeli zakupy dane:
01.01.2010, 50 zł
02.01.2010, 80 zł
04.01.2010, 50 zł
i teraz jakoś muszę wygenerować brakującą datę 03.01.2010, tak aby docelowo wyglądało to tak:
01.01.2010, 50 zł
02.01.2010, 80 zł
03.01.2010
04.01.2010, 50 zł

W zasadzie wystarczy coś co mi wygeneruje liczby od 1 do 365, a z datami to sobie już poradzę np. tak:
select to_date('2010-01-01') + rownum - 1 "data"
tylko nie wiem jak wymusić wygenerowanie dokładnie 365 wierszy.
Oczywiście to jedna z koncepcji, może jest też na to jakiś inny sposób.

Z góry dziękuję za pomoc.

Socjalizm to ustrój, który
bohatersko walczy z problemami
nieznanymi w innych ustrojach

  1. taka mała sztuczka , bwana 26/11/10 15:07
    select trunc(to_date('01-01','mm-dd') -1 + level) day
    from dual
    connect by level < 367 and to_char(to_date('01-01','mm-dd') -1 + level,'yyyy')=to_char(sysdate,'yyyy')

    wynik będzie zawsze zbiorem dat od 1 stycznia do 31 grudnia bieżącego roku.

    "you don't need your smile when I cut
    your throat"

    1. a co do rownum, to: where rownum < 366 , bwana 26/11/10 15:13
      tylko pamiętaj, rok czasem jest przestępny.

      żeby generować zbiór wierszy, używaj sztuczki z zapytaniem hierarchicznym (connect by) - bo jeśli użyjesz rzeczywistej tabeli i warunku na rownum, to może się okazać że w tabeli jest np. za mało wierszy.

      "you don't need your smile when I cut
      your throat"

      1. no tak, i używanie produkcyjnej tabeli i rownum jest mniej wydajne , bwana 26/11/10 15:15
        bo się CBO odpala, fetchują rekordy i tak dalej. A dual i connect by dzieje się praktycznie "w powietrzu".

        "you don't need your smile when I cut
        your throat"

    2. Dzięki... , JE Jacaw 26/11/10 15:50
      ...działa, zapomniałem o zapytaniach hierarchicznych - muszę sobie ten temat przypomnieć, bo niestety jak się coś rzadko używa to się zapomina.
      A czemu dałeś tam TRUNC, bo tego nie rozumiem i kurcze czemu 'mm-dd', a wynik jest z rokiem ?

      Socjalizm to ustrój, który
      bohatersko walczy z problemami
      nieznanymi w innych ustrojach

      1. Dobra... , JE Jacaw 26/11/10 15:51
        ...ostatnie odwołuję, już załapałem, ale trunc'a dalej nie rozumiem.

        Socjalizm to ustrój, który
        bohatersko walczy z problemami
        nieznanymi w innych ustrojach

        1. w przypadku dat trunc() odcina godziny, minuty, sekundy , bwana 26/11/10 16:19
          a funkcja sysdate zwraca tak datę jak i czas. łatwo się na tym pierdyknąć np. podczas porównywania dat, bo 2010-01-01 14:00:00 nie jest równa 2010-01-01 00:00:00.

          przykłady dla dat - uruchamiaj kolejno i obserwuj wynik:

          select to_char(sysdate, 'yyyy-mm-dd hh24:mi:ss') from dual;
          select to_char(trunc(sysdate,'cc'), 'yyyy-mm-dd hh24:mi:ss') from dual; --CC jak Century - odcięcie daty do wieku
          select to_char(trunc(sysdate,'yyyy'), 'yyyy-mm-dd hh24:mi:ss') from dual;
          select to_char(trunc(sysdate, 'mm'), 'yyyy-mm-dd hh24:mi:ss') from dual;
          select to_char(trunc(sysdate, 'dd'), 'yyyy-mm-dd hh24:mi:ss') from dual;
          select to_char(trunc(sysdate), 'yyyy-mm-dd hh24:mi:ss') from dual;
          select to_char(trunc(sysdate, 'hh'), 'yyyy-mm-dd hh24:mi:ss') from dual;
          select to_char(trunc(sysdate, 'mi'), 'yyyy-mm-dd hh24:mi:ss') from dual;

          "you don't need your smile when I cut
          your throat"

          1. Dzięki... , JE Jacaw 29/11/10 15:14
            ...przyznam, że tej właściwości funkcji TRUNC nie znałem, człowiek jednak uczy się całe życie. :-)
            Po kombinacjach wypracowałem coś takiego i chyba najlepiej odpowiada moim potrzebom, gdybyś zauważył jakiś błąd lub ryzyko błędu to byłbym wdzięczny za informację:

            select
            trunc(to_date('2010-01-01','YYYY-MM-DD') -1 + level) "DATA"
            from dual
            connect by
            level <= to_DATE('2010-10-31', 'YYYY-MM-DD') - to_DATE('2010-01-01', 'YYYY-MM-DD') + 1

            Socjalizm to ustrój, który
            bohatersko walczy z problemami
            nieznanymi w innych ustrojach

    
All rights reserved ® Copyright and Design 2001-2025, TwojePC.PL