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