Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Kako dobiti datum npr. prvog petka u godini

[es] :: MS SQL :: Kako dobiti datum npr. prvog petka u godini

[ Pregleda: 3378 | Odgovora: 8 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

marko v
programer
Šibenik

Član broj: 46810
Poruke: 109
*.adsl.net.t-com.hr.

Sajt: www.bono-husky.tk


Profil

icon Kako dobiti datum npr. prvog petka u godini26.10.2007. u 12:29 - pre 199 meseci
Dakle kao što je u naslovu teme rečeno treba mi datum recimo prvog petka u godini.Kako da dođem do toga koristeći sql?
 
Odgovor na temu

jablan

Član broj: 8286
Poruke: 4541



+710 Profil

icon Re: Kako dobiti datum npr. prvog petka u godini26.10.2007. u 12:42 - pre 199 meseci
Pogledaj funkcije dateadd i datepart. Mala petlja sa proverom i to je to.
 
Odgovor na temu

Zidar
Canada

Član broj: 15387
Poruke: 3085
*.100.46-69.q9.net.



+79 Profil

icon Re: Kako dobiti datum npr. prvog petka u godini26.10.2007. u 14:37 - pre 199 meseci
Moze li bez petlji, mi smo SQL programeri

Video sam negde resenje u jednom redu, ali ne mogu da ga se setim. Ima jedno drugo, koje resava mnogo slicnih problema (koji je treci cetvrtak u Oktobru sledece godine na primer, koliko ima utoraka u Decembru ove godine)

Napravis tabelu koja ima recimo dva polja. Mozes da dodas jos ako ti treba. Ovako:
CREATE TABLE Calendar
(
Datum datetime NOT NULL PRIMARY KEY -- moze i CLUSTERED, ne znam napamet kako da napisem
, Dan varchar(1) NOT NULL -- prevod na srpski dana u nedelji
, DrzavniPraznik smallint NOT NULL DEFAULT 0
)

Onda u Excelu ili necemu napravis jedno 5-10,000 dana, pocevsi od danas koje ces da umetnes u tabelu Calendar. To ti je 30 godina. Onda sledecih 30 godina samo pogledas u tabelu calendar i dobijes odgovor na svako moguce pitanje u vezi sa datumima.

Na primer, pitanje glasi "Koliko ima neradnih dana u 2008 godini (subote, nedelje i drzavni praznici)" se odgovara kverijem (svi kveriji su psudo kod, mozda negde sintaksa nije OK, ali je ideja bitna)

SELECT Datum, Dan, DrazvniPraznik
FROM CAlendar
WHERE Datum Between ('20080101' AND '20081231')
AND (Dan IN ('Subota','Nedelja') OR DrzavniPraznik=1)

Tvoj prvi petak u godini moze se dobiti ovako:
SELECT TOP 1
Datum, Dan
FROM Calendar
WHERE Datum BETWEEN ('1 Jan 2008' AND '31 Jan 2008')
AND Dan = 'Petak'
ORDER BY Datum

Bez tabele moglo bi ovako nekako: Imas zadatu godinu. Izracunas koji je dan 1. Januar te godine. ako je patak, ti si OK, ako nije znas koliko treba dana do sledecg petka. Trebac emalo CAST, CONVERT i CASE .. END da bi se izracunalo, ali tako nekao bi islo. nemam sad vremena, ako nadjem vremena pokusacu da uradim. Tabela Calendar mi je mnogo laksa, kveriji su pregledniji a i ne petljas se sa sintaksom DatePart i slicnih funkcija. I resenej radi na svim sistemima, ne samo MS SQL.

 
Odgovor na temu

jablan

Član broj: 8286
Poruke: 4541



+710 Profil

icon Re: Kako dobiti datum npr. prvog petka u godini26.10.2007. u 14:42 - pre 199 meseci
Citat:
Zidar: Moze li bez petlji, mi smo SQL programeri :-)

Nikad neću razumeti taj način razmišljanja da umesto funkcije od 3 linije praviš tabelu sa desetinama hiljada slogova. Ali to ne znači da niste u pravu... :)

Bio je pre par godina maltene identičan thread.

Citat:
Tabela Calendar mi je mnogo laksa, kveriji su pregledniji a i ne petljas se sa sintaksom DatePart i slicnih funkcija.

Zato služe UDF. Hvala bogu, sad sve baze nude nešto slično.
 
Odgovor na temu

DarkMan
Darko Matesic

Član broj: 20445
Poruke: 572
*.ptt.yu.

Jabber: DarkMan


Profil

icon Re: Kako dobiti datum npr. prvog petka u godini26.10.2007. u 15:21 - pre 199 meseci
Evo ti resenje u jednom redu:

Code:

declare @godina int, @dan int

set @godina = 2007
-- dan: 1 - nedelja, 2 - ponedeljak, 3 - utorak, 4 - sreda, 5 - cetvrtak, 6 - petak, 7 - subota
set @dan = 5

select DATEADD(d, (case when @dan < DATEPART(dw, convert(datetime, ltrim(@godina)+'-01-01')) then 7 else 0 end) + @dan - DATEPART(dw, convert(datetime, ltrim(@godina)+'-01-01')) , convert(datetime, ltrim(@godina)+'-01-01'))


Ili ako razbijemo u dva reda (prvi dan u godini se koristi na tri mesta):
Code:

declare @godina int, @dan int, @datum datetime

set @godina = 2007
-- dan: 1 - nedelja, 2 - ponedeljak, 3 - utorak, 4 - sreda, 5 - cetvrtak, 6 - petak, 7 - subota
set @dan = 5

set @datum = convert(datetime, ltrim(@godina)+'-01-01')
select DATEADD(d, (case when @dan < DATEPART(dw, @datum) then 7 else 0 end) + @dan - DATEPART(dw, @datum) , @datum)
 
Odgovor na temu

Zidar
Canada

Član broj: 15387
Poruke: 3085
*.100.46-69.q9.net.



+79 Profil

icon Re: Kako dobiti datum npr. prvog petka u godini26.10.2007. u 21:48 - pre 199 meseci
Citat:
Nikad neću razumeti taj način razmišljanja da umesto funkcije od 3 linije praviš tabelu sa desetinama hiljada slogova. Ali to ne znači da niste u pravu...


Nije vazno ko je u pravu, zato je forum, da se razmene misljenja. Hteo sam da pomenem ideju. Prostor nije skup i 10,000 ili 50,000 slogova u tabeli ovakvog tipa nisu nista za server. A takva tabela se moze upotrebiti u mali milion situacija.

Ako napises funkciju u SQL, bilo kakvu, ona sedi medju funkcijama. Ako ti ne treba CESTO ta funkcija, sanse su da ces zaboraviti i sta radi i kako radi. Cak se nces setiti ni da takva funkcija postoji kad ti zatreba onekad (veruj mi, to mi se ne jednom desilo) Umesto funkcije radije bih upotrebio kod koji je prilozio Darkman. Pod uslovom d aiz glave znam da ga napisem. Problem je sto takav kod nije trivijalan i treba malo da se pomucis da to napises. Ako pogledas takav neki SQL izraz, a da ti ne kazu sta radi, treba ti dosta vremena da provalis sta to taj izraz vraca, u funkciji ili bez funkcije. A uz pomoc tabele je zadatak koji smo videli smesno jednostavan.


Evo jos jedna upotreba calendar tabele: pratis nekakve dokumente koji imaju datum kreiranja. Hoces da vidis broj dokumenata za svaki dan nekog meseca, za SVAKI dan u mesecu, cak i kada nema dokumenata na taj dan. Resenje sa tabelom je prosto, ovako nekako:

SELECT C.Datum, COUNT(T.datum) AS DnaevniBrojDokumenta
FROM Calendar AS C
LEFT JOIN TvojaTabela ON T.datum = C.datum
WHERE T.datum BETWEEN '01012007' AND '01312007'
GROUP BY C.datum

Bez tabele, malo teze ide.


To je samo razmisljanje, ne znaci da je najbolje, recimo, jedan od nacina da se resi problem.
 
Odgovor na temu

marko v
programer
Šibenik

Član broj: 46810
Poruke: 109
*.adsl.net.t-com.hr.

Sajt: www.bono-husky.tk


Profil

icon Re: Kako dobiti datum npr. prvog petka u godini27.10.2007. u 08:53 - pre 199 meseci
Hvala svima na pomoci.
Kad sam pisao pitanje mislio sam da ce me netko poslati u .. negdje.. jer postavljam pitanja oko jednostavnih stvari.Sad, nakon vase rasprave vidim da stvar i nije bas toliko jednostavna.
 
Odgovor na temu

jablan

Član broj: 8286
Poruke: 4541



+710 Profil

icon Re: Kako dobiti datum npr. prvog petka u godini27.10.2007. u 09:08 - pre 199 meseci
I još malo pojednostavljeno Darkovo rešenje:
Code:

declare @godina int, @dan int, @datum datetime

set @godina = 2007
-- dan: 1 - nedelja, 2 - ponedeljak, 3 - utorak, 4 - sreda, 5 - cetvrtak, 6 - petak, 7 - subota
set @dan = 5

set @datum = convert(datetime, ltrim(@godina)+'-01-01')
select DATEADD(d, (7 + @dan - DATEPART(dw, @datum)) % 7 , @datum)

(Nisam na poslu pa ne mogu da probam, ali bi trebalo da je ok)
 
Odgovor na temu

DarkMan
Darko Matesic

Član broj: 20445
Poruke: 572
*.ptt.yu.

Jabber: DarkMan


Profil

icon Re: Kako dobiti datum npr. prvog petka u godini28.10.2007. u 03:17 - pre 199 meseci
Radi! Svaka ti cast. Ja se ovoga ne bih nikada setio. Razmisljao sam da li moze bez kondicionalne provere jer bi zapis bio kraci ali nisam znao drugacije.
 
Odgovor na temu

[es] :: MS SQL :: Kako dobiti datum npr. prvog petka u godini

[ Pregleda: 3378 | Odgovora: 8 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.