310 likes | 582 Views
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 )
E N D
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 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 'Pocetms'; Rozdil 5 Pocetms 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 datetimeformat.
Funkce – Datum a čas • DECLARE @cisloint; • 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 @cisloint; • 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'; • select SOUNDEX('Ahoj') as 'S1', • SOUNDEX('Ahum') as 'S2', • DIFFERENCE('Ahoj','Ahum') as 'D'; • select SOUNDEX('Ahoj') as 'S1', • SOUNDEX('Server') as 'S2', • DIFFERENCE('Ahoj','Server') as 'D'; S1 S2 D A200 A200 4 S1 S2 D A200 A500 3 S1 S2 D 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 'Bezupravy', • 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! AhojAhojAhojAhojAhoj 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 PekneOsklive 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 • DECLARE @cislodecimal(10,3); • SET @cislo= 193.57; • SELECT CAST(@cisloAS 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á. intdecimal 193 193.570 intdecimal 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); • SELECTCONVERT(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 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(); • SELECTCONVERT(varchar,@datum,100); • SELECTCONVERT(varchar,@datum,108); • Případně pouze datum: • DECLARE @datum datetime; • SET @datum=GETDATE(); • SELECTCONVERT(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(@hmas int); • DECLARE @hm varchar(10); • SET @hm='125.25' • SELECTCAST(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