|
[ brankec @ 14.07.2008. 20:58 ] @
| Imam sledeci problem: kako od ukupnog broja dana (recimo 6000 dana) izracunam koliko tu ima godina, mjeseci i dana pojedinacno. Broj godina nije problem, problem su mjeseci i dani kao ostatak (kako dobiti ostatak u access-u, odnosno da li ima neka funkcija). |
[ Scelle @ 14.07.2008. 22:05 ] @
Da bi to izracunao, moras racunati od nekog pocetnog datuma.
Evo sta sam ja iskopao iz funkcija koje sam mukotrpno sakupljao vremenom. :) Nije mojih ruku djelo, cini mi se da sam je uzeo bas sa ovog foruma.
Racuna razliku izmedju dva datuma u godinama, mesecima i danima. Namjena je racunanje starosti osobe, mislim...
Code:
Public Sub CalcAge(vDate1 As Date, vdate2 As Date, ByRef vYears As Integer,
ByRef vMonths As Integer, ByRef vDays As Integer)
' Comments : calculates the age in Years, Months and Days
' Parameters:
' vDate1 - D.O.B.
' vDate2 - Date to calculate age based on
' vYears - will hold the Years difference
' vMonths - will hold the Months difference
' vDays - will hold the Days difference
vMonths = DateDiff("m", vDate1, vdate2)
vDays = DateDiff("d", DateAdd("m", vMonths, vDate1), vdate2)
If vDays < 0 Then
' wierd way that DateDiff works, fix it here
vMonths = vMonths - 1
vDays = DateDiff("d", DateAdd("m", vMonths, vDate1), vdate2)
End If
vYears = vMonths \ 12 ' integer division
vMonths = vMonths Mod 12 ' only want leftover less than one year
End Sub
Pa ti provali kako radi... :)))))
[ Zidar @ 15.07.2008. 13:26 ] @
Ako ti je ulazni podatka broj dana, kao '6000' dana, onda ne moze da se da prcizan odgovor. 6000 dana je priblizno 98.63 godine, ako godina traje 365 dana. medjutim, svaka cetvrta godina traje 366 dana, pa se onda racunica komplikuje. Za neke proracune se usvaja da je godina 360.5 dana, mada je u stvari godina 360.25 (3*365 + 366)/4. Sve ovo vazi ako pretpostavis da prvi dan pada na pocetak godine i da je ta godina prosta. Znaci, ima mnogo pretpostavki i mogucnosti, koje sev daju malkice razlicitev rezultate.
Ako je pitanje tipa 'koliko godina, meseci, dana izmedju dva zadana datuma" onda se moze doci do tacnog odgovora i ne trebaju ti silne pretpostavke. Na forumu MS SQL neko je postavio identicno pitanje:
http://www.elitesecurity.org/t324310-razlika-datum-izrazena-mm-dd
Primer koji ti je Scelle dao je vazanm jer pokazuje kako se pravilno racuna s datumima. Starost nije samo Year(Date())- Year(DatumRodjenja) Mora se gledati da li DAte() (danasnji datum, datum na koji se zeli izracunati starost) pada pre ili posle rodjendana. Ovo znaci ako ti nas primer datediff u godinama vrati 14.3 godine, imas 14 godina a ono 0.3 treba da pretvoris u mesece i dane. Na slican nacin, datediff u mesecima moze da vrati 171.6 meseci (=14.3 godine) , sto zanci 171 mesec i jos 0.6 meseca. Ali od 171 mesec treba da oduzmes 14 x 12 = 168 meseci pa ti ostaje 3 m3seca. Dakle, 14.3 godine jeste 14 godina 3 meseca i 0,6 od poslednjeg meseca. Dtediff u danima za 14.3 godine jeste otprilike 5223 dana. E, ali imamo vec 14 godina i 3 meseca. Kolko je 0.6 meseci? Zavisi koji je mesec u pitanju. O.6 od Jula i 0.6 od Aprila nije isto. Takodje 0.6 od Februara sa 28 dana nije isto sto i 0.6 od Februara sa 29 dana, niti 0.6 od Decembra sa 31 dan. Sad se dakle vratis na pocetak, pa kazes otprilike ovako:
BrojGodina = datdiff(PocetniDatum, ZavrsniDatum, "year") (sintaksa je otprilike, tacnu ima su helpu)
DatumX = PocetniDatum + BrojGodina
BrojMeseci = datediff ( DatumX, ZavrsniDatum)
DatumY = DatumX + BrojMeseci
BrojDana = datediff (DatumY, ZavrsniDatum)
Otprilike tako nekako. Probaj, pa vidi.

[ Getsbi @ 15.07.2008. 14:35 ] @
@ Zidar
Pokvario ti se digitron 6000/365=16,44 , a ne 98.63
Najnovijim merenjima utvrđeno je da godina traje nešto manje, odnosno 365.242 dana ili tačno 365 dana 5 sati, 48 minuta i 48 sekundi. Ovako je u Vojvodini. Možda je u Kanadi drugačije.
I dobro nam došao gde god da si bio.
[ Zidar @ 15.07.2008. 15:16 ] @
Kineska roba, sta ces 
Bar sam bio blizu sa Godina = 365.25 
[ brankec @ 16.07.2008. 22:28 ] @
Evo kako sam ja to resio:
Godina: [dan]\365,25
Mjesec: ([dan]-(365,25*([dan]\365,25)))\30,4375
Dana: Round([dan]-(365,25*([dan]\365,25))-((30,4375*[mjesec]));0)
IspravkaG: IIf([dana]<0 And [mjesec]=0;[godina]-1;[godina])
IspravkaM: IIf([dana]<0;IIf([mjesec]-1<0;11;[mjesec]-1);[mjesec])
IspravkaD: IIf([dana]<0;30+[dana];[dana])
U tabeli [dan] se nalazi ukupan broj dana.
Uzeo sam da godina ima 365,25 dana a mjesec 30,4375 dana (kada 365,25 podelim sa 12).
Ispravke sam radio zbog toga sto npr. dobijem 30 godina 10 mjeseci i -9 dana pa onda to moram preracunati.
Ovako kako sam ja uradio postoji odredjena greska u nekoliko dana (a i ne mora). Zanima me kako da izracunam maksimalnu gresku, odnosno maksimalan broj dana za koliko mogu pogresiti i koji su to slucajevi (dan, dva sigurno ali ne puno vise, koliko sam ja uspeo shvatiti). Ukupan broj dana je vezan za radni staz (znaci radnik moze imati maksimalno oko 15000 dana).
Nadam se da sam bio jasan. Pozdrav.
[ Getsbi @ 17.07.2008. 05:08 ] @
@ brankec
Problem je što kalendar nije tako jednostavan upravo zbog broja dana u pojedinim mesecima i prestupnim godinama. Baratanjem bez nekog početnog datuma nećeš doći do dobrog rešenja.
Radni staž za koji kažeš da je pitanje vezano, ne obračunava se tako. U firmi se ne vodi broj dana koje je radnik proveo na poslu. Uvek postoji datum započinjanja i datum raskidanja radnog odnosa.
Broj dana i broj meseci u godini u kojoj je započet radni odnos sabiraju se sa brojem dana i brojem meseci u godini raskidanja radnog odnosa. Ukoliko broj punih meseci dostigne 12 prebacuje se u godine. Cele godine između se jednostavno zbrajaju.
Scelle je dao ispravan VBA kod. Ja sam ga samo primenio u primeru koji sam okačio u gornjem postu. Verujem da je forma "frmRacunanjeStarosti" idealna za problem radnog staža.
Moglo bi i drugačije, poštujući dosledno pravila računanja koja sam ovde naveo, ali verujem da bi VBA kod bio manje elegantan.
Što se tiče maksimalne greške, ovo nisu merenja (manje ili više precizna), da bi se bavio teorijom grešaka već egzaktno računanje.
Ako radniku budeš zakinuo i jedan dan, teško će te oprati maksimalna greška.
[ brankec @ 17.07.2008. 06:43 ] @
Moj zadatak vezano za radni staz je bio da uporedim podatke izmedju dve sluzbe jer su tokom vremena nastale neke greske (kadrovska i licni dohodci). U kadrovskoj se vodi ukupan staz (koji je razvrstan u nekoliko kategorija: borac, beneficirani, staz u nasoj firmi, prethodni staz i jos dve podele) a u LD-u ukupan staz manje beneficirani i manje neplaceni (koji naravno i nije staz). U kadrovskoj za svaku kategoriju postoji posebna kolona za godinu, mjesec i dan osim staza u nasoj firmi koji se obracunava na osnovu datuma zaposlavanja. U LD-u se vodi samo ukupan staz (manje gore navedeni) u godinama, mjesecima i danima. Jedini nacin koji ja vidim je da to uradim je da pretvorim staz prvo u dane pa onda zavrsim na onaj nacin na koji sam uradio. Razlike u 3-4 dana nisam uzimao u obzir.
Ne znam nacin kako bih to mogao uraditi da dobijem u dan sve tacno, ali sa druge strane razlika od 3-4 dana nije u ovom slucaju toliko bitna pod uslovom da nije veca (a mislim da ne moze biti veca, mada nisam siguran pa sam zato postavio pitanje kolika je maksimalna greska koju mogu na ovaj nacin napraviti).
Pozdrav.
[ Getsbi @ 17.07.2008. 09:00 ] @
Ne bih da ovo pretvorim u razglabanje o teoriji grešaka, gde se razmatraju slučajne ili grube greške, potom sistematske (nesavršenost alata), netačnost ulaznih podataka.....
Maksimalna greška se ne računa, ona se dobija iz dovoljnog broja merenjaje, u ovom slučaju računanja. Recimo ovako: uzmi datumske periode na (5,10,15.....40) godina, sračunaj pomoću gore datog VBA koda. U ovom slučaju to je etalon. Potom sračunaj tvojim načinom. Pogledaj rezultate. Uočićeš maksimalnu i minimalnu grešku (razliku). Srednju grešku znaš kako da dobiješ. Suma svih sa brojem merenja. Što više merenja (primera), bolja preciznost.
Mislim da je za tebe relevantnija srednja greška. Lakše je „sakriti“ iza nje nesavršenost metode.
Savet: Insistiraj kod drugih službi da ti daju datumske podatke na osnovu kojih su radili računanje staža. Tako ćeš uz primenu gore postavljenog koda jedino dobiti ispravne podatke.
[ boki026 @ 21.07.2008. 19:06 ] @
Private Sub PoslednjiDolazak_DblClick(Cancel As Integer)
On Error GoTo Err_PoslednjiDolazak_DblClick
Dim Pocetak, Kraj
Dim GS%, MS%, DS%
Pocetak = Me.PoslednjiDolazak
Kraj = Now()
GS = Year(Kraj) - Year(Pocetak)
MS = Month(Kraj) - Month(Pocetak)
DS = Day(Kraj) - Day(Pocetak) + 1
If DS < 0 Then
MS = MS - 1: DS = DS + 30
End If
If MS < 0 Then
GS = GS - 1: MS = MS + 12
End If
If GS < 0 Then
MsgBox ("Greška u unosu datuma poslednjeg dolaska")
Exit Sub
End If
If DS = 30 Then
MS = MS + 1: DS = 0
ElseIf DS = 31 Then
MS = MS + 1: DS = 1
End If
MsgBox "Godina= " & GS & "; Meseci= " & MS & "; Dana= " & DS & ".", vbInformation, "Poslednji dolazak"
Exit_PoslednjiDolazak_DblClick:
Exit Sub
Err_PoslednjiDolazak_DblClick:
MsgBox ("Niste uneli datum poslednjeg dolaska")
Resume Exit_PoslednjiDolazak_DblClick
End Sub
Ovo je kod koji racuna vreme od zeljenog datuma do danasnjeg dana na dupli klik datumskog polja(meni je trebao za neke druge stvari). Mozda pomogne.
[ izonic @ 22.07.2008. 10:24 ] @
Code: Function Period_D(Od_Datuma, BrojDana As Integer)
Dim DatumX As Date
Dim DatumD As Date
Dim Godine As Integer
Dim Mjeseci As Integer
Dim Dani As Integer
Dim I As Integer
Dim P As Integer
DatumD = Od_Datuma
DatumX = DatumD
P = Month(DatumD)
For I = 1 To BrojDana
DatumX = DatumX + 1
If P <> Month(DatumX) Then
P = Month(DatumX)
Mjeseci = Mjeseci + 1
Dani = 0
If Mjeseci > 11 Then
Mjeseci = 0
Dani = 0
Godine = Godine + 1
End If
End If
Dani = Dani + 1
Next I
Period_D = Godine & "/" & Mjeseci & "/" & Dani
End Function
E sad pitanje je dali se broji i zadni datum odnosno sa tim danom ili bez.
Ovo je sa tim danom.
Bez tog dana treba oduzeti jedan dan.
Ulazni podaci su:
Od_Datuma---Datum od kojeg brojimo Napr. "01.01.2001"
BrojDana-----Broj dana koje brojimo Napr. 600
Copyright (C) 2001-2025 by www.elitesecurity.org. All rights reserved.
|