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 - 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" - 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" - 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"
- 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 - 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 - 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" - 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') + 1Socjalizm to ustrój, który
bohatersko walczy z problemami
nieznanymi w innych ustrojach
|
|
|
|
|
All rights reserved ® Copyright and Design 2001-2024, TwojePC.PL |
|
|
|
|