Funkce Transact-SQL Výběr Filip Čálek
Souhrn Funkce T-SQL Datum a čas Práce s řetězci Konverze mezi typy
Funkce – Datum a čas Funkce pro získání data a času Tyto funkce můžeme rozdělit na funkce s větší přesností a funkce s menší přesností. F s větší přesností(ns) SYSDATETIME SYSDATETIMEOFFSET SYSUTCDATETIME F s menší přesností(ms) CURRENT_TIMESTAMP GETDATE GETUTCDATE Rozdíly si ukážeme na následujícím příkladu.
Funkce – Datum a čas SELECT SYSDATETIME() ,SYSDATETIMEOFFSET() ,SYSUTCDATETIME() ,CURRENT_TIMESTAMP ,GETDATE() ,GETUTCDATE() ; Výstup: 2010-03-09 16:57:41.9156594 2010-03-09 16:57:41.9156594 +01:00 2010-03-09 15:57:41.9156594 2010-03-09 16:57:41.913 2010-03-09 15:57:41.913 Z ukázky je patrné, že v prvních třech případech se jedná o funkce s větší přesností. Je nutné dále rozlišit funkce, které vrací čas platný na vašem počítači a nebo GMT.
Funkce – Datum a čas Parametry funkcí První parametr těchto funkcí bývá tzv. datepart: Year, month, day, hour, minute atd. Definujeme jaká hodnota se bude vracet. Další parametry se odvíjí dle funkce. Jeden z dalších parametrů načítá datum a čas ve formátu datetime. Např. 2010-03-09, nebo 2010/03/09. může i obsahovat proměnnou, případně funkci Getdate().
Funkce – Datum a čas DATENAME/DATEPART/DATEDIFF DATENAME vrací nvarchar hodnotu z konkrétního data/času. Např. název měsíce. DATENAME(datepart,datetime) DATEPART funguje shodně akorát vrací číselnou hodnotu. DATEDIFF vrací číselnou hodnotu a sice rozdíl mezi tzv. startdate a enddate ve tvaru datetime. DATEDIFF(datepart,startdate,enddate)
Funkce – Datum a čas Příklady: DECLARE @datum datetime; SET @datum=GETDATE(); SET LANGUAGE Czech; SELECT DATENAME(DAY, @datum) AS 'Den', DATENAME(MONTH, @datum) AS 'Mesic', DATENAME(YEAR,@datum) AS 'Rok'; ……. SELECT DATENAME(MONTH, @datum) AS 'Mesic_N’, DATEPART(MONTH, @datum) AS 'Mesic_P’; Den Mesic Rok 9 březen 2010 Mesic_N Mesic_P březen 3
Funkce – Datum a čas Příklady: SELECT DATEDIFF(YEAR,'2005', '2010’) as ‚Rozdil'; SELECT DATEDIFF(millisecond, GETDATE(), SYSDATETIME()) as 'Pocet ms'; Rozdil 5 Pocet ms 3
Funkce – Datum a čas DATEADD/SET LANGUAGE DATEADD upraví datum/čas o určitý námi zvolený interval. Např. posune měsíc o jedna,čili z ledna se stane únor. DATEADD(datepart,cislo,datetime) Druhý parametr „cislo“ určuje velikost intervalu. SET LANGUAGE upraví nejen názvy měsíce, ale i datetime format.
Funkce – Datum a čas DECLARE @cislo int; SET @cislo=0; WHILE @cislo<12 BEGIN SELECT CONVERT(varchar,DATEADD(MONTH,@cislo,'2010-1-31'),104) SET @cislo=@cislo+1; END; 31.01.2010 28.02.2010 31.03.2010 30.04.2010 … Z příkladu je patrné, že počet dnů je automaticky upraven, aby odpovídal skutečnosti.
Funkce – práce s řetězci ASCII/CHAR/CHARINDEX/DATALENGTH ASCII převádí char na číselnou ASCII hodnotu. CHAR naopak převádí z ASCII kódu na znak. CHARINDEX vyhledává char nebo podřetězec v řetězci a sice, že nalezne jeho první znak. DATALENGTH vrací hodnotu odpovídající délce řetězce.
Funkce – práce s řetězci NCHAR/UNICODE/SUBSTRING V případě převádění do unicode a zpět použijeme funkce UNICODE/NCHAR SUBSTRING vrací část řetězce. Většinou se používá jako pomocná funkce k jiným funkcím, jako např. ASCII,UNICODE… SUBSTRING(retezec, index, rozsah)
Funkce – práce s řetězci DECLARE @cislo int; DECLARE @znak int; SET @cislo=0; WHILE @cislo<=DATALENGTH('ahoj') BEGIN SET @cislo=@cislo+1; SET @znak=ASCII(SUBSTRING('ahoj', @cislo,1)); SELECT @znak, CHAR(@znak) END; Převedeme v cyklu „ahoj“ do ASCII a pak za pomoci funkce CHAR zase zpět na znaky. 97 a 104 h 111 o 106 j NULL NULL
Funkce – práce s řetězci SELECT SUBSTRING('AHOJ',2,2), SUBSTRING('AHOJ',3,2), SUBSTRING('AHOJ',1,3), SUBSTRING('AHOJ',1,4); Ukázka jak se chová SUBSTRING při změně parametrů. HO OJ AHO AHOJ
Funkce – práce s řetězci DIFFERENCE/SOUNDEX DIFFERENCE porovnává dva řetězce a vrací číselnou hodnotu od 0 do 4. 0 – největší možný rozdíl. 4 – nejmenší nebo žádný rozdíl. Neporovnává přímo řetězce, ale kódy vytvořené pomocí funkce SOUNDEX – kód se skládá ze čtyř znaků. První obsahuje první char řetězce a dále tři číselné znaky. Např. SOUNDEX(‘Ahoj’) vrací kód A200.
Funkce – práce s řetězci select SOUNDEX('Ahoj') as 'S1', SOUNDEX('Ahoj') as 'S2', DIFFERENCE('Ahoj','Ahoj') as 'D'; SOUNDEX('Ahum') as 'S2', DIFFERENCE('Ahoj','Ahum') as 'D'; SOUNDEX('Server') as 'S2', DIFFERENCE('Ahoj','Server') as 'D'; S1 S2 D A200 A200 4 A200 A500 3 A200 S616 0
Funkce – práce s řetězci SOUNDEX – stručné vysvětlení tzv. fonetického algoritmu. Tři číselné znaky ohodnocují souhlásky daného slova následujícím způsobem: b, f, p, v = 1 c, g, j, k, q, s, x, z = 2 d, t = 3 l = 4 m, n = 5 r = 6 Soundex z AHOJ vrací A200, protože: A - je první znak. H - není nijak ohodnoceno O – není souhláska J – ohodnoceno jako 2 Jelikož slovo dál nepokračuje, je kód doplněn nulami.
Funkce – práce s řetězci SOUNDEX – příklady SELECT SOUNDEX('robert') SELECT SOUNDEX('rupert') Vzhledem k tomu, že B a P má stejné ohodnocení, vychází nám v tomto případě stejný kód. R163 V případě dvou nebo více stejně ohodnocených souhlásek po sobě je ohodnocena pouze první z nich. Řetězec GGGG by vrátil G200. Doplněním jiného znaku např.: GGPGG nám vyjde G212. Pokud soundex již ohodnotil tři souhlásky, tak případné další ignoruje.
Funkce – práce s řetězci LOWER/UPPER/LTRIM/RTRIM LOWER velké znaky převede na malé. UPPER naopak převede malé na velké. LTRIM odstraní mezery na začátku řetězce RTRIM odstraní mezery na konci řetězce.
Funkce – práce s řetězci DECLARE @Z CHAR(15); SET @Z=' ahoj'; SELECT @Z AS 'Bez upravy', LTRIM(@Z) AS 'Po uprave'; SELECT LOWER(SUBSTRING('AHOJ', 1, 4)) AS Lower, UPPER(SUBSTRING('ahoj', 1, 4)) AS Upper; Bez upravy Po uprave ahoj ahoj Lower Upper ahoj AHOJ
Funkce – práce s řetězci REPLACE/REPLICATE/REVERSE REPLACE může změnit námi zvoleny podřetězec za jiný. Můžeme tak ve větě změnit např. jedno slovo. REPLICATE zopakuje řetězec podle zvoleného čísla. REVERSE otočí pořadí znaků v řetězci.
Funkce – práce s řetězci SELECT REPLACE('Uceni je nuda!','nuda','zabava'); SELECT REPLICATE('Ahoj ',5); SELECT REVERSE('Ahoj'), REVERSE('kobylamamalybok') , REVERSE('12345'); Uceni je zabava! Ahoj Ahoj Ahoj Ahoj Ahoj johA kobylamamalybok 54321
Funkce – práce s řetězci STR/STUFF STR zaokrouhlí na jedno či více desetinných míst, případně na celá čísla. STUFF vloží jeden řetězec do druhého na určité místo. Také je možnost vymazat určitý počet znaků a na jejich místo vloží vkládaný řetězec.
Funkce – práce s řetězci SELECT STR(29.994, 5, 2), STR(29.994,5,1); DECLARE @auto char(20); SET @auto='Mam auto'; SET @auto=STUFF(@auto, 4, 0, ' pekne'); SELECT @auto as 'Pekne', STUFF(@auto,4,6,' osklive') as 'Osklive'; 29.99 30.0 Pekne Osklive Mam pekne auto Mam osklive auto
Konverze mezi typy CAST a CONVERT Základní funkce pro převody mezi datovými typy. Tyto funkce jsou funkčností téměř shodné. Liší se způsob zápisu a funkce CONVERT na rozdíl od funkce CAST umožňuje definování stylu. Styl se definuje zejména u funkcí data a času. Konkrétně ovlivňuje formát data/času.
Konverze mezi typy V tomto případě je funkce shodná. DECLARE @cislo decimal(10,3); SET @cislo = 193.57; SELECT CAST(@cislo AS int) as 'int', CAST (@cislo as decimal(10,3)) as 'decimal'; SELECT CONVERT(int, @cislo) as 'int', CONVERT(decimal(10,3),@cislo) as 'decimal'; V tomto případě je funkce shodná. int decimal 193 193.570
Konverze mezi typy Podívejme se na rozdíl mezi CAST a CONVERT v případě konverze datetime. DECLARE @datum datetime; SET @datum=GETDATE(); SELECT CAST( @datum as varchar); SELECT CONVERT(varchar,@datum,109); Výstup bude již jiný kvůli stylu. Mar 3 2010 2:40PM Mar 3 2010 2:40:14:897PM Jak již bylo řečeno, styl se definuje pouze funkcí CONVERT.
Konverze mezi typy Základní styly pro formát data/času - Styl Standard Výstup 0 / 100 Default mon dd yyyy hh:miAM (or PM) 1 101 U.S. mm/dd/yyyy 2 102 ANSI yy.mm.dd 3 103 British/French dd/mm/yyyy 4 104 German dd.mm.yy 5 105 Italian dd-mm-yy 6 106 dd mon yy 7 107 Mon dd, yy 8 108 hh:mi:ss 9 109 Default + ms mon dd yyyy hh:mi:ss:mmmAM (or PM) Toto je výčet základních typů stylu. Je jich mnohem více, ale většina je již více či méně odvozena z těchto prvních. Pokud styl nevyplníme, automaticky se dosadí základní „100“.
Konverze mezi typy Pár ukázek použití stylu. Pokud chceme pouze čas: DECLARE @datum time; SET @datum=GETDATE(); SELECT CONVERT(varchar,@datum,100); SELECT CONVERT(varchar,@datum,108); Případně pouze datum: DECLARE @datum datetime; SELECT CONVERT(varchar,@datum,101), CONVERT(varchar,@datum,102), CONVERT(varchar,@datum,103), CONVERT(varchar,@datum,104); 4:34PM 16:34:32 03/10/2010 2010.03.10 10/03/2010 10.03.2010
Konverze mezi typy Možné problémy Občas konverze není možná z důvodu nevyhovujícího datového typu. DECLARE @hm varchar(10); SET @hm='125.25' SELECT CAST(@hm as int); SELECT CAST(CAST(@hm as decimal(10,5)) as int); V tomto případě konverze nelze provést. Proto je nutné převést varchar nejprve na decimal a teprve pak na int. Výsledek: 125
Závěr Použitá literatura http://msdn.microsoft.com Děkuji za pozornost