Weblog @ rebex.cz

Weblogy na webu Rebexu
Welcome to Weblog @ rebex.cz Sign in | Help
in Search

Weblog @ Rebex.cz :: Honza Šotola

nepravidelné poznámky .NET vývojáře

Častá chyba při porovnávání datetime hodnot

Celkem častou programátorskou konstrukcí je porovnání datumových (správně česky "datových" :-) hodnot (reprezentovaných jak v .NETu tak v SQL Serveru typem datetime).

Problémy nastávají, když něteré hodnoty byly vytvořeny systémovou funkcí DateTime.Now resp. GetDate().
Právě kvůli té časové složce často nedělá program to, co od něj vývojář očekával.

Nezafunguje např. test na shodný den

 dateTime1 == dateTime2 (přestože obě dvě proměnné obsahují stejný den)

a další častou chybou je konstrukce

 if (dateTimeValue < DateTime.Now)
   Report("Zadejte alespoň dnešní datum");

která bude nesprávně varovat i dnes.

A proč se o tom tak dlouho vykecávám?
Protože všechny tyhle problémy odstraní snadno zapamatovatelný návyk:

Všude, kde při porovnávání pracujete s čistým datem (a nepoužíváte časovou složku)
přistupujte k hodnotám typu DateTime přes jeho property Date.

Výše uvedený příklad by pak vypadal následovně:

 if (dateTimeValue.Date < DateTime.Now.Date)
   Report("Zadejte alespoň dnešní datum");

Předpokládám, že vykonání property Date moc výkonu nezabere a za tu eliminaci chyb to stojí zvyknout si psát ji všude kde to jde.
Nebo používáte někdo jiné konvence?

P.S. tohle všechno funguje přímo v .NETu, pokud se programuje nějaká logika jen na úrovni SQL serveru,
používám obvykle následující funkcičku:

---------------------------------------------------------------------
-- CutTime() --
---------------
-- Ořízne čas z datetime, vrací jen datum (resp. datetime kde čas je 0:00:00.000)
CREATE
FUNCTION CutTime (@src datetime
   RETURNS datetime AS
BEGIN 
   RETURN CONVERT(datetime, CONVERT(varchar(8),@src,112))
END
GO

Published 2. února 2006 9:43 by honzas

Comment Notification

If you would like to receive an email when updates are made to this post, please register here

Subscribe to this post's comments using RSS

Comments

 

RADl0PASlV said:

pokud nekomu jde o vykon, tak bych doporucil tuto konstrukci:

CONVERT(DATETIME,CONVERT(INT,CONVERT(FLOAT,@src)))

mela by byt o neco malo rychleji. Kdysi jsem delal test na nekolika stovkach tisic zaznamu a ze vsech moznych metod mi tahle vysla nejrychlejsi.
února 2, 2006 14:58
 

pavel v. said:

A neni lepsi pouzit pro porovnani dvou datumu DATEDIFF(day, @date1, @date2)? Pak kdyz = 0 tak jsou stejne atd..
února 3, 2006 12:40
 

honzas said:

Dik, to vypada rozumne.
A hlavne standardnimi prostredky T-SQL a ja uz si nebudu muset hlidat deploy funkce CutTime (casto to byva jedina user-defined funkce v projektu a tak se na ni pri deployi zapomina...]
února 15, 2006 23:31

Leave a Comment

(required) 
(optional)
(required) 
Submit
Powered by Community Server (Personal Edition), by Telligent Systems