Mariusz Gibki

Mariusz Gibki "Jeśli się chce
szuka się sposobu,
jesli nie szuka sie
po...

Temat: SQL Serwer Zapytanie tworzące tabele z datami z...

Witam wszystkich sympatyków i znawców SQL. Próbuję rozwiązać taki problem. W tworzonej aplikacji potrzebuję mieć dostęp do tabeli która zostanie stworzona przez użytkownika poprzez wybranie dwóch wartości dataTime. I tak np.:

użytkownik wybiera dwie daty : 01-01-1979 i 31-12-2200.

W Tabeli powinny się pojawić : kolejne ID... , i listy pierwszych i ostatnich dni miesięcy zawierających się pomiędzy datami.

ID.... | data1 | data2 |
1 01.01.1979 31.01.1979
2 01.02.1979 28.02.1979
3 01.03.1979 31.03.1979
. . .
. . .
N 01.12.2200 31.12.2200

Czyli użytkownik wybiera z dowolnej kontrolki daty lub wpisuje do textboxa (nie ma znaczenia jak pobierze) wynik taki jak powyżej.

Z takiego układu tabeli mogę wyliczyć dla każdego miesiąca liczbę dni pracujących (lub w godzinach) itd... Może ma ktoś pomysł jak do tego podejść. Można by ręcznie wpisywać te wszystkie daty ale jak potrzeba tylko wybrany zakres? Być może można inaczej podejść do tego problemu? Zapraszam do dyskusji, interesują mnie możliwości rozwiązania takiego zadania.
Dariusz Jaros

Dariusz Jaros Programista Oracle,
Delphi

Temat: SQL Serwer Zapytanie tworzące tabele z datami z...

Zamiast generować ręcznie lepiej napisać procedure która wypełni to automatycznie: funkcja ADD_MONTHS( data, ilosc_dodanych_miesiecy ) wygeneruje kolejne wartości, przynajmie przy zastosowaniu oracle, i wywoływać procedure z aplikacji klienckiej.
Anna Jędrej

Anna Jędrej Dyrektor Biura
Sprawozdawczości
Finansowej

Temat: SQL Serwer Zapytanie tworzące tabele z datami z...

Zgadzam sie z Darkiem, mozna zrobic petle wstawiajaca kolejny miesiac ADD_MONTHS( data, i) do momentu gdy data zrowna sie z data konca.
Czy potrzebujesz tej tabeli tylko do wyliczania liczby dni pracujacych? Bo jesli tak to moze darowac sobie tabele tylko funkcja wyliczyc te dni?

konto usunięte

Temat: SQL Serwer Zapytanie tworzące tabele z datami z...

Nie znam SQL Serwera, nie wiem, czy istnieje odpowiednik Oraclowego "connect by", ale dla Oracle rozwiązanie częściowe to na przykład:

SELECT rownum,
add_months (trunc (to_date ('200801', 'YYYYMM'), 'MONTH'), rownum-1),
last_day (add_months (trunc (to_date ('200801', 'YYYYMM'), 'MONTH'), rownum-1))
FROM dual
CONNECT BY level <= months_between (to_date ('201001', 'YYYYMM'), to_date ('200801', 'YYYYMM'));

To w ogóle wygodna metoda tworzenia ciągów:
SELECT ROWNUM num,
FROM dual
CONNECT BY LEVEL <= 10;
Powyższe generuje 10 wierszy zawierających liczby od 1 do 10.

A dlaczego częściowe? Ponieważ - zapewne w wyniku ograniczeń implementacyjnych - taki connect by zagłębia się maksymalnie na 100 poziomów i więcej wierszy nie zwróci. Można próbować obchodzić to złączając dwie wygenerowane w ten sposób tabele (jedna generuje lata, kolejna miesiące).Łukasz Pluta edytował(a) ten post dnia 23.06.08 o godzinie 09:53

konto usunięte

Temat: SQL Serwer Zapytanie tworzące tabele z datami z...

nie bardzo widze zastosowanie takiej tabeli, bo lepiej napisać funkcje która to wyliczy ...ale niech ma ;)

create table #miesiace (
idd int not null identity (1, 1),
pierwszy datetime ,
ostatni datetime )

set nocount on
declare @bm datetime
declare @lm datetime
declare @i int

set @bm = '2000-01-01'
set @i =0
while @i <240 --dla 20 lat
begin
select @bm=dateadd(m,1,@bm),@lm =dateadd(d,-1,dateadd(m,1,@bm))
insert #miesiace
select @bm,@lm

set @i =@i+1

end

select * from #miesiace
--drop table #miesiace
Mariusz Gibki

Mariusz Gibki "Jeśli się chce
szuka się sposobu,
jesli nie szuka sie
po...

Temat: SQL Serwer Zapytanie tworzące tabele z datami z...

Bardzo dziękuję za wszystkie odpowiedzi w końcu rozwiązałem to w taki sposób :

with x (dy, cnt)
as
(
select cast(cast(year('2006-10-5')as varchar) + '-' +
cast(month('2006-10-5')as varchar)+ cast('-01' as varchar) as datetime),1
from T1
union all
select dateadd(m, 1, dy), cnt+1 from x where cnt
<datediff(m,'2006-10-5','2008-1-5')
)
select dy, cnt , cast(datediff(d,1,dateadd(m,1,dy))as datetime) from x

Rozwiązanie Roberta również się sprawdza. W powyższym kodzie w miejsce dat używam oczywiście zmiennych w miejscu gdzie jest "T1" jest to po prostu jednoelementowa tabela z jednym wpisem o wartości int = 1.

Wydaje mi się że jest to najlepsze rozwiązanie ale może macie jeszcze inne propozycję. I tak jak nadmienił Robert przechowywanie takiej tabeli nie jest konieczne. Dziękuję za odpowiedzi Robertowi, Łukaszowi i Annie podpowiedź Dariusza również okazała się przydatna. Jak się okazuje człowiek uczy się przez całe życie..

Ciekawi mnie również Funkcja o której mówicie czy można by przykład takiej funkcji?Mariusz Gibki edytował(a) ten post dnia 23.06.08 o godzinie 11:35

Następna dyskusja:

dwie tabele jedno zapytanie...




Wyślij zaproszenie do