Velmi často se stává, že při práci s DATETIME datovým typem nás nezajímá informace o čase, ale pouze datum. Před příchodem SQL 2008 neexistovaly samostatné datové typy pro ukládání pouze datum nebo pouze času (DATE, TIME) a pokud byl v datetime datovém typu uložen i čas, nezbývalo, než čas odstranit (respektive vynulovat k půlnoci) a dále pracovat s DATETIME datovým typem jako by obsahoval pouze datum.
Nejčastěji používanou metodou bylo využití funkcí DATEADD() a DATEDIFF(). Nejprve pomocí funkce DATEDIFF() získáme počet dnů od dne 0 (1.1.1753) do aktuálního data vráceného funkcí GETDATE(). Poté toto číslo převedeme na datum pomocí funkce DATEADD(), kdy ke dni 0 (1.1.1753) opět přičteme počet dnů získaných v předchozím kroku.
Nyní si vše ukážeme v tomto jednoduchém příkladu:
DECLARE @DateTime DATETIME SET @DateTime = '2015-05-31 14:33:22' SELECT @DateTime SELECT DATEADD(D, 0, DATEDIFF(D, 0, @DateTime)) GO
Nejprve jsem si nadefinovali proměnnou @DateTime datového typu DATETIME a následně nastavili její hodnotu na uvedený datum a čas. Hodnotu v proměnné jsme zobrazili pomocí SELECTu nejprve v původní podobě a poté s odstraněním informace o čase.
Uvedený zápis není samozřejmě jedinou možností. Stejného výsledku můžeme dosáhnout například i takto:
SELECT CAST(DATEDIFF(D, 0, GETDATE()) AS DATETIME)
SQL 2008
Při vývoji databází pro verzi 2008 a vyšší již nejsme vázáni pouze na použití datového typu DATETIME (s výjimkou požadavku zpětné kompatibility), ale můžeme využít přímo nový datový typ DATE, který umožňuje uložit pouze informaci o datu a dále s ní pracovat bez nutnosti řešit odstranění časové informace např. při porovnávání. DATE můžeme efektivně využít i pro náš účel, tedy odstranění času z DATETIME datového typu, a to tak, že provedeme přetypování z DATETIME na DATE:
DECLARE @DateTime DATETIME SET @DateTime = '2015-05-31 14:33:22' SELECT @DateTime [DATETIME] SELECT CAST(@DateTime AS DATE) [DATE] GO
Na obrázku vidíme, že informace o čase byla odstraněna stejně jako v předchozím případě, ale také, že Management Studio správně rozumí novému DATE typu a zobrazuje ho jinak než DATETIME.
Stejným způsobem můžeme postupovat, pokud potřebujeme z DATETIME získat pouze čas. Pouze místo na DATE provedeme přetypování na TIME:
DECLARE @DateTime DATETIME SET @DateTime = '2015-05-31 14:33:22' SELECT @DateTime [DATETIME] SELECT CAST(@DateTime AS TIME) [TIME] GO
Na obrázku si můžeme všimnout jedné podstatné věci. DATETIME má za desetinou tečkou tři nuly (milisekundy) a TIME nul sedm (stovky nanosekund). Je to dáno tím, že nové datové typy (DATETIME2, DATE, TIME) od verze 2008 dále přináší vyšší přesnost času a řeší tím některé problémy starších datových typů. Pokud bychom chtěli v našem případě dosáhnout stejné přesnosti času jakou poskytuje DATETIME, museli bychom provést přetypování na TIME(3), kdy hodnotou v závorce v rozsahu 0 až 7 určíme počet desetinných míst, na která se bude dělit vteřina, v našem případě tedy 3:
DECLARE @DateTime DATETIME SET @DateTime = '2015-05-31 14:33:22' SELECT @DateTime [DATETIME] SELECT CAST(@DateTime AS TIME(3)) [TIME] GO