DB2 rok miesiac
jarek - 11-05-2007 12:33
DB2 rok miesiac
Witam, Czy ktoś z szanownych grupowiczów może podpowiedzień jak mam połączyń pola rok='2007' miesiac='01' aby zrobić between
where rok||miesiac between '200701' and '200712'
Pozdrawiam
-- Wysłano z serwisu OnetNiusy: http://niusy.onet.pl
Artur - 11-05-2007 12:33
wszystko zależy od tego jak przechowujesz datę w bazie danych. Jeśli wprowadziłeś dane do bazy w postaci dwóch pól: rok i miesiąc, to takie rozwiązanie nie jest zbyt szczęśliwe, ponieważ w zapytaniu będziesz musiał porównywać niezależnie rok, a następnie porównać w następnej klauzuli miesiąc.
Jeśli wybierzesz pole typu DATE wtedy możesz na takich danych swobodnie operować (porównywać daty jak w kalendarzu):
....where pole_data between '2007-01-01' and '2007-03-31' ....where pole_data between '2007-01-01' and ( date('2007-03-01') + 1 month) ....where pole_data between '2007-01-01' and ( date('2007-03-01') + 1 month - 5 days + 1 year)
Jeśli chcesz porównywać zakresami po miesiącach (a nie dniach) wystarczy, że zrobisz takie przekształcenie:
int(pole_data)/100
dostaniesz liczbę, która wygląda jak rok i miesiąc (np. 200705), którą także możesz porównywać zakresami: .... where int(pole_data)/100 between 200701 and 200703
PS. Możesz też wykorzystać funkcje, takie jak month(pole_data), year(pole_data), np:
C:\temp>db2 values year(current date)
1 ----------- 2007
1 record(s) selected.
-- Artur Wroński
Sebastian Ciesielski - 16-05-2007 00:01
Użytkownik "Artur" <artur.wronski@gmail.com> napisał w wiadomości news:1178698300.491306.277330@n59g2000hsh.googlegr oups.com... wszystko zależy od tego jak przechowujesz datę w bazie danych. Jeśli wprowadziłeś dane do bazy w postaci dwóch pól: rok i miesiąc, to takie rozwiązanie nie jest zbyt szczęśliwe, ponieważ w zapytaniu będziesz musiał porównywać niezależnie rok, a następnie porównać w następnej klauzuli miesiąc.
wcale nie
where (rok*12+miesiąc) between (innyrok*12+miesiąc)
S.
Artur - 16-05-2007 00:01
On 15 Maj, 11:37, "Sebastian Ciesielski" <s...@poczta.fm> wrote: > Użytkownik "Artur" <artur.wron...@gmail.com> napisał w wiadomościnews:1178698300.491306.277330@n59g2000hs h.googlegroups.com... > wszystko zależy od tego jak przechowujesz datę w bazie danych. Jeśli > wprowadziłeś dane do bazy w postaci dwóch pól: rok i miesiąc, to takie > rozwiązanie nie jest zbyt szczęśliwe, ponieważ w zapytaniu będziesz > musiał porównywać niezależnie rok, a następnie porównać w następnej > klauzuli miesiąc. > > wcale nie > > where > (rok*12+miesiąc) between (innyrok*12+miesiąc) > > S.
Wyrażenie (rok*12+miesiąc) between (innyrok*12+miesiąc) and (ijeszczennyrok*12+miesiąc) rzeczywiście jest zapisane w postaci jednego warunku, ale wydajnościowo jest nie do zaakceptowania, ponieważ pociąga sekwencyjny skan całej tabeli (nawet jak masz indeksy na polach rok oraz miesiąc to baza ich nie użyje). Czyli w praktyce nikt tak tego nie zapisze.
-- Artur
Sebastian Ciesielski - 17-05-2007 22:44
Wyrażenie (rok*12+miesiąc) between (innyrok*12+miesiąc) and (ijeszczennyrok*12+miesiąc) rzeczywiście jest zapisane w postaci jednego warunku, ale wydajnościowo jest nie do zaakceptowania, ponieważ pociąga sekwencyjny skan całej tabeli (nawet jak masz indeksy na polach rok oraz miesiąc to baza ich nie użyje). Czyli w praktyce nikt tak tego nie zapisze.
to fakt, ale jeśli autor postu, z jakichś przyczyn, datę ma zapisaną w taki sposób, to może niech doda pole GENERATED ALWAYS z wykalkulowaną jakąś akceptowalną datą
pozdrawiam
S.
Artur - 17-05-2007 22:44
> to fakt, > ale jeśli autor postu, z jakichś przyczyn, datę ma zapisaną w taki sposób, > to może niech doda pole GENERATED ALWAYS z wykalkulowaną jakąś akceptowalną > datą > > pozdrawiam > > S.
zgadzam się. Pole GENERATED ALWAYS z indeksem rozwiąże problem wydajnościowy. Jeśli jednak aplikacja jest we wczesnej fazie dewelopementu (tego nie wiem) sensowniej jest wbrać DATE albo TIMESTAMP.
Tak na marginesie to wyrażenie porównujące powinno mieć postać (w odniesieniu do oryginalnej treści zapytania):
where rok*100 + miesiac between 200701 and 200712
Pozdrawiam, Artur
zanotowane.pldoc.pisz.plpdf.pisz.pleffulla.pev.pl
|
db2 alter table alter column set default
=?ISO-8859-2?Q?Re:_DB2_-_niesp=F3jne_zapytanie_wg._asktom.oracle.com?=
Oracle XE lub DB2 Express-C i wspolpraca z Visual C# 2005 Expess Edition
IBM DB2 Express - czy podobnie jak Oracle Expreess ma wycieta Javew procedurach?
Re: DB2 za darmo - =?ISO-8859-2?Q?troch=EA_wi=EAcej?=
=?ISO-8859-2?Q?db2_obj=EAto=B6=E6_bazy?=
[db2] Update sql posiłkowany danymi z innej tabeli
=?iso-8859-2?q?Konfiguracja_domy=B6lna_DB2_Express-C?=
[DB2/Websphere]: JDBC - result set closed
db2 -klucze obce optymalizacja zapytan i inne
zanotowane.pldoc.pisz.plpdf.pisz.plnatalia97.htw.pl
Cytat
Decede mihi sole - nie zasłaniaj mi słonca. Gdy kogoś kochasz, jesteś jak stworzyciel świata - na cokolwiek spojrzysz, nabiera to kształtu, wypełnia się barwą, światłem. Powietrze przytula się do ciebie, choćby był mróz, a ty masz w sobie tyle radości, że musisz ją rozdawać wokoło, bo się w tobie nie mieści Hoc fac - tak czyń. A tergo - od tyłu; z tyłu. I czarne włosy posiwieją. Safona |
|