T-SQL

Odstranění času nebo datumu z DATETIME datového typu

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

DatetimeToDate1

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

DatetimeToDate2

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

DatetimeToDate3

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

DatetimeToDate4

Leave a Reply

Your email address will not be published. Required fields are marked *