Fórum pro uživatele kancelářského balíku OpenOffice | LibreOffice
 

#1 8. 1. 2023 00:29:44

LADER
Člen
Registrace: 3. 4. 2013
Příspěvků: 145

(Vyřešeno) Funkce DATEDIF počítá nesprávně

Zdravím, při experimentování s výpočtem stáří (v rocích, měsících a dnech), jsem zjistil, že v některých případech zabudovaná funkce DATEDIF počítá nesprávně. Někdy připočítává 1, 2, nebo i 3 dny ke správnému výsledku. Nesprávné hodnoty jsou zvýrazněny červeně. Vypadá to, že počítá s měsícem o délce 31 dnů i když je kratší.
K porovnání jsem připojil makro, které snad (dle mého názoru) to počítá správně.
Testovaný soubor ke stažení

Editoval LADER (10. 1. 2023 06:23:56)


Ubuntu 22.04.4 LTS, LibreOffice Verze: 7.6.6.3, wxMaxima 20.12.1, Maxima 5.47.0 (SBCL)

Offline

#2 8. 1. 2023 07:43:51

neutr
Člen
Registrace: 8. 3. 2007
Příspěvků: 3,468

Re: (Vyřešeno) Funkce DATEDIF počítá nesprávně

LADER napsal(a)

Zdravím, při experimentování s výpočtem stáří (v rocích, měsících a dnech), jsem zjistil, že v některých případech zabudovaná funkce DATEDIF počítá nesprávně. Někdy připočítává 1, 2, nebo i 3 dny ke správnému výsledku. Nesprávné hodnoty jsou zvýrazněny červeně. Vypadá to, že počítá s měsícem o délce 31 dnů i když je kratší.
K porovnání jsem připojil makro, které snad (dle mého názoru) to počítá správně.
Testovaný soubor ke stažení


     Ano máte pravdu, Vaše makro je správně. problém je v tom, že se nejedná o chybu systému, ale o formát vkládání údajů do funkce DATEDIF - nemá být ve formátu národního prostředí.

Nápověda napsal(a)

Abyste zabránili chybné interpretaci data jako součásti vzorce, použijte funkci DATE, například DATE(1954;7;20), nebo datum uzavřete do uvozovek a použijte zápis podle normy ISO 8601, například "1954-07-20". Vyhněte se formátům závislým na národním prostředí, jako je například "07/20/54", výpočet pak může vést k chybám, pokud je dokument načten v jiném národním prostředí.

     Převádět na ISO, nebo používat DATE znamená vždy nepříjemné úpravy ve vzorci. Vaše funkce to řeší jako převod s DATE celkem elegantně. Možná by nebylo od věci zahrnout tuto funkci do nápovědy (která kopíruje originální nápovědu). Ale nápověda pro česko - slovenské uživatele by mohla mít vsuvku a podobu Vašeho makra, ačkoliv nevidím důvod proč by Vaše makro nemohlo fungovat v každém národním prostředí. Komplimenty pro VB a VBA jsou běžné proto nevidím důvod proč nepřidat jen pro Basic funkční řešení s podobou například NDatedif (jako national datedif). V každém případě by to byl výborný námět na vylepšení LO.


Moje e-mailová adresa
Pokud je Váš problém vyřešen, označte prosím svůj příspěvek za "VYŘEŠENÝ"
Zlepšíte orientaci při vyhledávání řešení JAK OZNAČIT TÉMA ZA VYŘEŠENÉ

Offline

#3 10. 1. 2023 06:22:59

LADER
Člen
Registrace: 3. 4. 2013
Příspěvků: 145

Re: (Vyřešeno) Funkce DATEDIF počítá nesprávně

Díky za odpověď, zde Microsoft přiznal, že tato funkce nemusí počítat správně:

Upozornění:  Excel poskytuje funkci DATEDIF za účelem podpory starších sešitů z Lotusu 1-2-3. Funkce DATEDIF může za určitých scénářů vypočítat nesprávné výsledky.

Důležité:  Nedoporučujeme používat argument "MD", protože s ním existují známá omezení. Viz níže část o známých problémech.

Pokud by někdo chtěl použít moje makro, pak jsem jej zkrátil a okomentoval:

Function Stari(Dat1 As Date, Dat2 As Date) As Variant
	' Výpočet stáří (rozdíl mezi dvěmi daty), nepočítá s hodinami, minutami a vteřinami
	' Vstup: [ Dat1 - Počáteční datum,  Dat2 - Koncové datum], počáteční musí být nižší jak koncové
	' Výstup: [ Rok, Měsíc, Den ]
	
	On Error GoTo Chyba
	Dim Mesic%(13), R%, M%, D%, R1%, M1% ' % - Integer, & - Long
	' Defaultně má LibreOffice nastaveno indexování pole od nuly (Option Base 0):
	Mesic = Array(0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31)

	' Základní výpočet "na hrubo"
	R1 = Year(Dat1)
	M1 = Month(Dat1)
	R = Year(Dat2) - R1
	M = Month(Dat2) - M1
	D = Day(Dat2)	 - Day(Dat1)
	
	' Korekce měsíců		
	If D<0 Then
		M = M - 1
		D = D + Mesic(M1) 
		If M1=2 Then  ' Kontrola na přestupný rok (únor)
			If (R1 Mod 4) = 0 Then 
				If ((R1 Mod 100)<>0) Or ((R1 Mod 400)=0) Then 
					' Korekce na delší únor
					D = D + 1
				EndIf
			EndIf 
		EndIf 
	EndIf 
	
	' Korekce roků
	If M<0 Then 
		R = R - 1
		M = M + 12		
	EndIf
	
	' Sestavení výstupu
	Stari = Right("00" & R, 2) & "R, " & Right("00" & M, 2) & "M, " & Right("00" & D, 2) & "D"	
	Exit Function 
	
Chyba:
	' Nespecifikovaná chyba při výpočtu
	Stari = "Chybka"	
End Function

Zde je testovaný soubor ke stažení Výpočet věku - TEST4


*Opraveno makro, opraven odkaz na správný soubor.

Editoval LADER (12. 1. 2023 14:28:56)


Ubuntu 22.04.4 LTS, LibreOffice Verze: 7.6.6.3, wxMaxima 20.12.1, Maxima 5.47.0 (SBCL)

Offline

#4 10. 1. 2023 10:58:11

kabi
Člen
Registrace: 1. 6. 2017
Příspěvků: 172

Re: (Vyřešeno) Funkce DATEDIF počítá nesprávně

Výpočet přestupných roků je poněkud komplikovanější, pokud byste tedy chtěl počítat se staršími datumy, musíte zohlednit ještě následující podmínku - rok, který je dělitelný 100 je přestupný rok pouze v případě, že je dělitelný 400 (což např. rok 1900 není a tedy není přestupný).

Offline

#5 10. 1. 2023 12:27:01

LADER
Člen
Registrace: 3. 4. 2013
Příspěvků: 145

Re: (Vyřešeno) Funkce DATEDIF počítá nesprávně

Díky za připomínku, úplně jsem na tu podmínku zapomněl,
inkriminovaný řádek se pak změní takto:

If ((R1 Mod 100)<>0) Or ((R1 Mod 400)=0) Then 

ještě něco dělám, pak to tam doplním... (Už jsem to opravil)

Editoval LADER (12. 1. 2023 14:36:41)


Ubuntu 22.04.4 LTS, LibreOffice Verze: 7.6.6.3, wxMaxima 20.12.1, Maxima 5.47.0 (SBCL)

Offline

Zápatí