Operace nad datumovými datovými typy jsou hodně frekventované a často potřebujeme pomocí SQL funkcí získat datum nebo nějakou jinou informaci, která z datumu vychází – například číslo týdne, měsíce, roku, posledního dne v měsíci a podobně.
Dnešní datum – GETDATE(), SYSDATETIME()
Dnešní datum a čas k okamžiku realizace dotazu můžeme získat dvěma způsoby. Prvním je SQL funkce GETDATE() a druhým SYSDATETIME(). Obě funkce vrací datum a čas s tím, že funkce sysdatetime je více precizní a vrací výsledek na nanosekundy. Pokud bychom chtěli datum, tak provedeme pomocí funkce CAST nebo CONVERT konverzi na datový typ DATE.
SELECT
GETDATE() AS [GETDATE() Datum a čas]
,SYSDATETIME() AS [SYSDATETIME() Datum a čas];
Číslo týdne a ISO týdne – DATEPART(WEEK, ISO_WEEK)
K získání čísla týdne využijeme SQL funkci DATEPART, která přijímá 2 argumenty – interval a datum 1. Jako interval můžeme použít WEEK (týden), to by však byla ve většině případů chyba. Alespoň pokud chceme dosáhnout stavu podle kalendáře. Číslo týdne má poměrně složitou definici, podobně jako Velikonoce (když pogooglíte, tak určitě něco najdete) 🙂 a WEEK je do značné míry zjednodušené. Vhodnější je použít jako argument ISO_WEEK. Viz příklad, kdy DATEPART(WEEK, 2017-12-31) vrací číslo týdne 53 (dle kalendáře to byl týden č. 52).
SELECT
DATEPART (WEEK,'2017-12-31') AS [Week]
,DATEPART (ISO_WEEK,'2017-12-31') AS [ISO_Week]
Číslo roku, měsíce a dne v roce – YEAR, MONTH, DAY, DATEPART
Rok, měsíc a den můžeme získat pomocí vestavěných SQL funkcí YEAR, MONTH a DAY nebo pomocí funkce DATEPART kam dosadíme jako první argument co chceme zobrazit a jako druhý argument je datum (např GETDATE())
SELECT
DATEPART (YEAR,GETDATE()) AS [DATEPART - Rok]
,DATEPART (MONTH,GETDATE()) AS [DATEPART - Mesic]
,DATEPART (DAY,GETDATE()) AS [DATEPART - Den]
,YEAR(GETDATE()) AS [YEAR - Rok]
,MONTH(GETDATE()) AS [MONTH - Mesic]
,DAY(GETDATE()) AS [DAY - Den]
SQL Dotaz na název měsíce a dne v češtině – DATENAME
V SQL Server se na název měsíce a dne dotazujeme pomocí funkce DATENAME(). Ta podobně jako funkce DATEPART přijímá 2 parametry (interval a datum). Názvy vrací defaultně podle toho jak máte nastaven jazyk na SQL Serveru. Pokud bychom chtěli, aby nám SQL Server vrátil název měsíce a dne v češtině, musíme změnit nejprve jazyk podobně jako na příkladu níže.
SELECT
DATENAME(MONTH, GETDATE()) AS [Název měsíce]
,DATENAME(WEEKDAY, GETDATE()) AS [Název dne]
SET LANGUAGE Czech
SELECT
DATENAME(MONTH, GETDATE()) AS [Název měsíce]
,DATENAME(WEEKDAY, GETDATE()) AS [Název dne]
První a poslední den v měsíci v T-SQL – EOMONTH, DATEADD
Poslední den v měsíci se dá získat pomocí nativní SQL funkce EOMONTH(). Na první den v měsíci žádná funkce není, ale to nevadí. Není to težké, dá se to udělat elegantně a méně elegantněji. Elegantní způsob spočívá v tom, že si pomocí EOMONTH zobrazíme konec předchozího měsíce a násedně pomocí DATEADD přidáme jeden den. Neelegantně můžeme datum poskládat přes YEAR, MONTH a 01 a výsledek převést na date (poslední sloupec).
SELECT
EOMONTH(GETDATE()) AS [Poslední den měsíce]
,DATEADD(DAY,1,EOMONTH(GETDATE(),-1)) AS [První den v měsíci - elegantní]
,CAST(
CAST(YEAR(GETDATE()) AS varchar(4)) +'-'
+ CAST(MONTH(GETDATE()) AS varchar(2)) +'-01' AS date)
AS [První den v měsíci - neelegantní, ale funkční]
Kdyby vás napadlo ještě něco co by v tomto článku mohlo zaznít, ozvěte se do komentáře
Použité zdroje
- Microsoft, DATEPART (Transact-SQL) [on-line]. [cit. 2018-12-11]. Dostupné z WWW: https://docs.microsoft.com/en-us/sql/t-sql/functions/datepart-transact-sql?view=sql-server-2017