V předchozím článku jsem podrobně popisoval používání základních operací pro práci s datem a časem. Dnes se zaměříme na to, jak s datem a časem počítat. A to vše opět na straně serveru, ale i na straně klienta.
DateDiff
Pomocí funkce DateDiff snadno a jednoduše zjistíme rozdíl mezi dvěmi daty. Funkce nemá problémy při práci s přestupnými roky ani po roce 2000 včetně přestupného roku 2000.
rozdil=datediff(interval,datum1,datum2) | |

Funkce Datediff má tři povinné parametry, parametr datum1 a datum2 jsou data, mezi nimiž chceme zjistit rozdíl. Parametr interval udává jednotky času, ve kterých chceme rozdíl mezi datumy vrátit.
Nastavení |
Význam |
yyyy |
Vrácený rozdíl je v rocích |
q |
Vrácený rozdíl je ve čtvtletích (čtvrtletí = 3 měsíce) |
m |
Vrácený rozdíl je v měsících |
d |
Vrácený rozdíl je ve dnech |
w |
Vrácený rozdíl je v týdnech |
h |
Vrácený rozdil je v hodinách |
n |
Vrácený rozdíl je v minutách. Pozor – m vrací rozdíl v měsících, proto je pro minuty třeba použít n |
s |
Vrácený rozdíl je v sekundách |
|
V příkladu číslo 1 jsou uvedeny možnosti použití funkce DateDiff pro jednotlivé možnosti nastavení parametru interval.
Příklad 1:
Response.Write („Od 1.1.2000 uplynulo „&datediff(„yyyy“,“1.1.2000″,now())&“ roků“) Response.Write („<br>“) Response.Write („Od 1.1.2000 uplynulo „&datediff(„q“,“1.1.2000″,now())&“ čtvrtletí“) Response.Write („<br>“) Response.Write („Od 1.1.2000 uplynulo „&datediff(„m“,“1.1.2000″,now())&“ měsíců“) Response.Write („<br>“) Response.Write („Od 1.1.2000 uplynulo „&datediff(„d“,“1.1.2000″,now())&“ dní“) Response.Write („<br>“) Response.Write („Od 1.1.2000 uplynulo „&datediff(„w“,“1.1.2000″,now())&“ týdnů“) Response.Write („<br>“) Response.Write („Od 1.1.2000 uplynulo „&datediff(„h“,“1.1.2000″,now())&“ hodin“) Response.Write („<br>“) Response.Write („Od 1.1.2000 uplynulo „&datediff(„n“,“1.1.2000″,now())&“ minut“) Response.Write („<br>“) Response.Write („Od 1.1.2000 uplynulo „&datediff(„s“,“1.1.2000″,now())&“ sekund“) Response.Write („<br>“) Response.Write („Do začátku tisiciciletí zbývá „&datediff(„d“,“1.1.2001″,now())&“ dní“) Response.Write („<br>“) Response.Write („Do začátku tisiciciletí zbývá „&abs(datediff(„d“,“1.1.2001″,now()))&“ dní“) | |

Jak jste si jistě všichni všimli, v příkladu jsem použil i datum z budoucnosti. Funkce DateDiff pracuje tak, že pokud je datum1 větší než datum2, tak vrací záporné číslo. Této vlastnosti lze využít při porovnávání datumů.
V úvodu popisu funkce DateDiff jsem se zmínil, že funkce NEMÁ problémy s přestupnými roky. Pro ty co tomuto tvrzení nevěří tu mám příklad 2, který poskytne důkaz. V příkladu si ukážeme zjištění počtu dnů mezi datem 27.2. a 1.3. pro různé roky.
Nejprve ale malá ukázka z kalendáře. Výchozí den si označíme písmenem D a pokud rok dané datum obsahuje napíšeme do příslušné kolonky 1. Nakonec sečteme jednotlivé řádky tabulky a dostaneme počet dní mezi 27.2. a 1.3. pro jednotlivé roky

rok |
27.2. |
28.2. |
29.2 |
1.3. |
počet dní od 27.2. do 1.3. |
1996 |
D |
1 |
1 |
1 |
3 |
1999 |
D |
1 |
0 |
1 |
2 |
2000 |
D |
1 |
1 |
1 |
3 |
2001 |
D |
1 |
0 |
1 |
2 |
|

A teď konečně to, co jsme si udělali ručně, provedeme pomocí funkce Datediff. Příklad 2:
response.write(„Mezi 27.2. a 1.3. v roce 1996 jsou „&datediff(„d“,“27.2.1996″,“1.3.1996″)&“ dny“) Response.Write („<br>“) response.write(„Mezi 27.2. a 1.3. v roce 1999 jsou „&datediff(„d“,“27.2.1999″,“1.3.1999″)&“ dny“) Response.Write („<br>“) response.write(„Mezi 27.2. a 1.3. v roce 2000 jsou „&datediff(„d“,“27.2.2000″,“1.3.2000″)&“ dny“) Response.Write („<br>“) response.write(„Mezi 27.2. a 1.3. v roce 2001 jsou „&datediff(„d“,“27.2.2001″,“1.3.2001″)&“ dny“) Response.Write („<br>“) | |

Pokud porovnáte počty dní mezi daty pro jednotlivé roky ve výsledku příkladu 2 s počty dnů uvedenými v tabulce zjistíte, že jsou shodné a to je důkaz, že funkce DateDiff nemá problémy s přestupnými roky
DateAdd
Funkce DateAdd přičítá k zadanému datumu zadaný interval (rok, mesic atd.). Funkce správně počítá s přestupnými roky:
vysledek=dateadd(jednotky,kolik,datum) | |

Fukce DateAdd má tři povinné parametry a to sice datum, jednotky ve kterých bude počítáno a počet jednotek.
Nastavení |
Význam |
yyyy |
Jsou přičítány (odečítány) roky |
q |
Jsou přičítány (odečítány) čtvrtletí |
m |
Jsou přičítány (odečítány) měsíce |
d |
Jsou přičítány (odečítány) dny |
w |
Jsou přičítány (odečítány) týdny |
h |
Jsou přičítány (odečítány) hodiny |
n |
Jsou přičítány(odečítány) minuty |
s |
Jsou přičítány(odečítány) sekundy |
|

Příklad 3:
Response.Write („Loni bylo :“&dateadd(„yyyy“,-1,now)) Response.Write („<br>“) Response.Write („Za dva roky bude :“&dateadd(„yyyy“,2,now)) Response.Write („<br>“) Response.Write(„1.únor 2000 a měsic navrch je: „&dateadd(„m“,1,“1.2.2000″)) Response.Write („<br>“) Response.Write(„30 dní k 1. unoru 2000 je: „&dateadd(„d“,30,“1.2.2000″)) Response.Write („<br>“) Response.Write(„30 dní k 1. unoru 2001 je: „&dateadd(„d“,30,“1.2.2001″)) Response.Write („<br>“) Response.Write(„Den po 28.únoru 1999 je „&dateadd(„d“,1,“28.2.1999″)) Response.Write („<br>“) Response.Write(„Den po 28.únoru 2000 je „&dateadd(„d“,1,“28.2.2000″)) Response.Write („<br>“) Response.Write(„Den po 28.únoru 2001 je „&dateadd(„d“,1,“28.2.2001″)) Response.Write („<br>“) | |

Funkce DateAdd umí zpracovávat i záporná čísla a díky tomu lze od zadaného data odečítat.
DatePart
Funkce DatePart vrací část předaného data v jednotce, kterou si vybereme. Většinu věcí, které umožňuje funkce DatePart, lze provést pomocí funkcí Year, Moth, Day, Hour, Minute a Second, jenž byly popsány v minulém dílu článku. Funkce DatePart má, ale mnohem více možností a její používání je pružnější.
vysledek=datepart(cas,datum) | |

Funkce DatePart má dva povinné parametry a to sice datum a idetifikaci části data, které chceme obdržet
Nastavení |
Význam |
yyyy |
Vrací rok ze zadaného data |
q |
Vrací čtvrtletí, ve kterém je zadané datum |
m |
Vrací měsíc ze zadaného data |
d |
Vrací den ze zadaného data |
w |
Vrací týden ve kterém je zadané datum |
h |
Vrací hodinu ze zadaného času |
n |
Vrací minutu ze zadaného času |
s |
Vrací sekundu ze zadaného času |
|

Pokud je zadán jen čas do datové položky a chcete získat například informace o roku,měsíci dni či čtvrtletí připravte se na to, že obdržíte 30.12.1889. Pokud je zadáno jenom datum a požadujete informace o čase předpokládá se že čas je 0:0:0
Příklad 4:
Response.Write(„Zpracováván bude údaj 13:35:15“) Response.Write („<br>“) Response.write(„Rok z výrazu kde je pouze čas: „&datepart(„yyyy“,“12:35:15″)) Response.Write („<br>“) Response.write(„Měsíc z výrazu kde je pouze čas: „&datepart(„m“,“12:35:15″)) Response.Write („<br>“) Response.write(„Den z výrazu kde je pouze čas: „&datepart(„d“,“12:35:15″)) Response.Write („<br>“) Response.Write („<br>“) Response.Write(„Zpracováván bude údaj 12.5.2000“) Response.Write („<br>“) Response.write(„Hodina z výrazu kde chybí časový údaj: „&datepart(„h“,“12.5.2000″)) Response.Write („<br>“) Response.write(„Minuta z výrazu kde chybí časový údaj: „&datepart(„n“,“12.5.2000″)) Response.Write („<br>“) Response.write(„Sekunda z výrazu kde chybí časový údaj: „&datepart(„s“,“12.5.2000″)) Response.Write („<br>“) Response.Write („<br>“) Response.Write(„Prozpracování bude použit aktuální čas a datum („&now&“)“) Response.Write („<br>“) Response.write(„Aktuální čtvrtletí je: „&datepart(„q“,now)) Response.Write („<br>“) Response.write(„Aktuální měsíc je: „&datepart(„m“,now)) Response.Write („<br>“) Response.write(„Aktuální rok je: „&datepart(„yyyy“,now)) | |
Dodatek k funkcím DateDiff,DatePart a DateAdd V kapitolách o funkcích DateDiff,DatePart a DateAdd jsem se zmínil pouze o povinných parametrech těchto funkcí. Tyto funkce, ale mají i dva nepovinné parametry. Kompletní způsob volání těchto funkcí pak vypadá takto:
rozdil=datediff(interval,datum1,datum2,prvnidenvtydnu,prvnitydenvroce) vysledek=dateadd(jednotky,kolik,datum,prvnidenvtydnu,prvnitydenvroce) vysledek=datepart(cas,datum,prvnidenvtydnu,prvnitydenvroce) | |

Prvnidenvtydnu urcuje, kterým dnem začíná týden, pokud je vynecháno použije se systémové nastavení.
Prvnitydenvroce určuje, který týden v roce je první. Pokud je vynecháno, předpokládá se, že první týden je ten, který obsahuje 1. leden.
To je pro dnešek vše. V dalším díle miniseriálu o datu a času nás čeká nejen několik konverzních funkční, ale také stopky, které nám umožní měřit až 20 různých času s přesností větší, než je jedna sekunda.
Starší komentáře ke článku
Pokud máte zájem o starší komentáře k tomuto článku, naleznete je zde.