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
 
 » Shark20 02:40
 » rzymo 02:03
 » Pinokio.p 01:28
 » elliot_pl 01:26
 » biEski 01:13
 » yanix 00:46
 » rarek 00:38
 » ReeX 00:30
 » ili@s 00:24
 » Lucyferiu 00:20
 » DYD 00:20
 » dida 00:19
 » Pawelec 00:09
 » myszon 23:59
 » Faraonix 23:50
 » coolio 23:48
 » Wojtekar 23:47
 » Wolf 23:42
 » piszczyk 23:38
 » mo2 23:38

 Dzisiaj przeczytano
 41147 postów,
 wczoraj 25974

 Szybkie ładowanie
 jest:
włączone.

 
ccc
TwojePC.pl © 2001 - 2024
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-2024, TwojePC.PL