SQLShack
Úvod
Častým úkolem pro nováčky je naučit se SQL konvertovat datum a pracovat s nimi tak, aby převedli datum na jiné datové typy nebo převedli jiné datové typy na datum.
Zde v tomto článku si vysvětlíme, jak pracovat a převádět data na jiné formáty nebo naopak.
Požadavky
- SQL Server nainstalován. Počínaje SQL Serverem 2008
Příklad
První příklad bude jednoduchý, v tabulce máme sloupec varchar s datem, ale potřebujeme převést varchar na datum. Musíme provést SQL konverzi data.
Zde je skript pro vytvoření tabulky s daty:
1
2
3
4
5
6
7
8
9
10
11
12
|
CREATE TABLE .(
NOT NULL,
(100) NULL,
CONSTRAINT PRIMARY KEY CLUSTERED
(
ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON
) ON
GO
INSERT . (, ) VALUES (1, N’02-03-2005′)
INSERT . (, ) VALUES (2, N’03-05-2006′)
INSERT . (, ) VALUES (3, n’04-05-2011′)
|
Chceme převést sloupec date z nvarchar(100) na datum.
K tomu se pokusíme upravit návrh tabulky:
![](https://www.sqlshack.com/wp-content/uploads/2019/04/ssms-design-table.png)
Pokusíme se změnit Typ dat na smalldatetime:
![](https://www.sqlshack.com/wp-content/uploads/2019/04/change-varchar-to-smalldatime-in-ssms.png)
Zobrazí se následující chybové hlášení:
Ukládání změn není povoleno. Provedené změny vyžadují zrušení a nové vytvoření následujících tabulek. Buď jste provedli změny v tabulce, kterou nelze znovu vytvořit, nebo jste zapnuli volbu Zabránit ukládání změn, které vyžadují nové vytvoření tabulky.
Chcete-li tuto chybu vyřešit, přejděte v SSMS do nabídky Nástroje > Možnosti:
![](https://www.sqlshack.com/wp-content/uploads/2019/04/change-options-in-ssms.png)
V Možnostech přejděte do nabídky Návrháři > Návrháři tabulek a databází a zrušte zaškrtnutí volby Zabránit ukládání změn, které vyžadují nové vytvoření tabulky:
![](https://www.sqlshack.com/wp-content/uploads/2019/04/uncheck-prevent-saving-changes-that-require-table.png)
Tato volba zakáže možnost zabránit ukládání obnovení tabulky. Když změníte datový typ sloupce, vyžaduje to opětovné vytvoření tabulky:
Nyní můžete uložit návrh a vaše tabulka bude převedena na data a konverze dat SQL bude dokončena:
![](https://www.sqlshack.com/wp-content/uploads/2019/04/sql-convert-date-date-time-results-after-convert.png)
Konverzní funkce
T-SQL obsahuje funkce pro konverzi datových typů. K provedení SQL konverze dat použijeme CAST a CONVERT.
Začneme nejprve s CAST:
Jak převést z varchar, nvarchar, char, nchar na sql date pomocí CAST
Následující příklad, ukáže, jak převést znaky na datum typu date pomocí funkce CAST:
1
2
|
declare @vardate varchar(100)=’03-04-2016′
select CAST(@vardate AS datetime) AS dataconverted;
|
Příklad deklaruje proměnnou s názvem vardate a poté je tato proměnná, která je varchar, převedena na datetime pomocí funkce CAST.
Poznámka: Další informace o funkci CAST naleznete na tomto odkazu: CAST a CONVERT (Transact-SQL)
Jak provést SQL převod data z varchar, nvarchar, char, nchar na datum pomocí funkce CONVERT
CONVERT je funkce, která umí totéž co CAST v předchozím scénáři.
1
2
|
declare @vardate varchar(100)=’03-04-2016′
select CONVERT(datetime, @vardate) as dataconverted
|
Kód T-SQL provádí totéž co cast, ale používá funkci CONVERT. Výhodou funkce CONVERT je, že můžete snadno změnit formát data pomocí argumentu style.
Pokud například chcete datum ve formátu ISO, můžete použít následující větu jazyka T-SQL:
1
|
select CONVERT(nvarchar(30),getdate(), 121) as isoformat
|
Jak převést sql datum do různých formátů v T-SQL
Následující příklad ukazuje, jak převést formát data do různých formátů.
Pro formát Japananes:
1
|
select CONVERT(nvarchar(30),getdate(), 111) as Japanformat
|
Pro formát USA:
1
|
select CONVERT(nvarchar(30),getdate(), 110) as USAformat
|
Pro formát ANSI:
1
|
select CONVERT(nvarchar(30),getdate(), 102) as ANSIformat
|
Pro britský formát:
1
|
select CONVERT(nvarchar(30),getdate(), 103) as Britishformat
|
Pro německý formát:
1
|
select CONVERT(nvarchar(30),getdate(), 104) as Germanformat
|
Pro italský formát:
1
|
select CONVERT(nvarchar(30),getdate(), 105) as Italianformat
|
Pro evropský výchozí formát:
1
|
select CONVERT(nvarchar(30),getdate(), 113) as EuropeDefaultformat
|
Pro ODBC Canonical:
1
|
select CONVERT(nvarchar(30),getdate(), 120) as ODBCCanonicalformat
|
Vždy máte možnost použít funkci FORMAT a získat datum v požadovaném formátu:
1
|
SELECT FORMAT( getdate(), ‚dd/MM/yy‘)
|
FORMAT je jednodušší pro práci s daty a použití formátu podle vašich preferencí, protože nemusíte znát styl. Podle mých zkušeností se však setkávám se spoustou kódu, který používá funkce CAST a CONVERT, takže je lepší je znát.
Poznámka: Další informace o funkci FORMAT najdete na tomto odkazu:
Problémy týkající se operací SQL s převodem data
Při pokusu o převod na datum to není vždy možné. Následující příklad ukazuje běžnou chybu:
1
2
|
declare @vardate varchar(100)=’11242016′
select CONVERT(datetime, @vardate) as dataconverted
|
Chybové hlášení je následující:
Msg 242, Level 16, State 3, Line 22
Převod datového typu varchar na datový typ datetime vedl k hodnotě mimo rozsah.
Pro datum potřebujete oddělovače jako „/“, „.“ nebo „-„.
Následující příklad upraví řetězec z 11242016 na 11-24-2016 a poté jej převede na datum sql:
1
2
3
4
5
|
declare @vardate varchar(100)=’11242016′
set @vardate= SUBSTRING(@vardate, 1, 2)+‘-‚+ SUBSTRING(@vardate, 3, 2)+‘-‚+SUBSTRING(@vardate, 5, 4)
select CONVERT(date, @vardate) as dataconverted
|
Pomocí substringu spojíme „-„, abychom použili přijatelný formát data, a pak pomocí funkce CONVERT převedeme znaky na sql datum.
Datové typy data
V SQL Serveru existuje několik typů datových typů data:
- Time vrací hodiny, minuty, sekundy a nanosekundy (hh:mm:ss.nnnnnn)
- Date vrací rok, měsíce a dny (rrrr-mm-dd)
- Datetime vrací data v tomto formátu: RRRR-MM-DD hh:mm:ss
- Smalldatetime vrací datum v tomto formátu: RRRR-MM-DD hh:mm:ss
- Datetime2 je podobný Datetime, ale má větší přesnost (RRRR-MM-DD hh:mm:ss)
- Datetimeoffset má přesnost datetime2, ale používá se pro časová pásma v UTC
SQL převést datum na celé číslo
Pokud použijete CONVERT nebo CAST pro převod datetime na celé číslo, vrátí se počet dní od roku 1900 do zadaného data.
Například následující kód T-SQL zobrazí počet dní od roku 1900 do dneška:
1
|
SELECT CONVERT(INT, GETDATE()).
|
Na celé číslo můžete převést také rok, měsíce, dny atd. z hodnoty datetime. Následující kód ukazuje, jak uložit do celočíselných proměnných den, měsíc a rok hodnoty data:
1
2
3
4
5
|
declare @year int = year(getdate())
declare @month int = month(getdate())
declare @day int = day(getdate())
select @year as year,@month as month,@day as day
|
Obvyklé otázky týkající se převodu data v SQL Serveru
Poznámka: Následující odkaz obsahuje nejčastější dotazy týkající se funkcí a dat v SQL Serveru: V tomto článku jsme se naučili, jak v SQL Serveru provést SQL konverzi data
Závěry
. Dozvěděli jsme se, jak upravit datový typ v tabulce, jak používat funkce CAST, CONVERT a FORMAT. Seznámili jsme se také s různými typy datových typů SQL.
- Autor
- Poslední příspěvky
![](https://s33046.pcdn.co/wp-content/uploads/gravatar/danielcalbimonte.jpg)
Pracoval pro vládu, ropné společnosti, webové stránky, časopisy a univerzity po celém světě. Daniel také pravidelně přednáší na konferencích o SQL Serverech a píše blogy. Je autorem školicích materiálů k certifikačním zkouškám SQL Server.
Pomáhá také s překlady článků na serveru SQLShack do španělštiny
Zobrazit všechny příspěvky od Daniel Calbimonte
![](https://s33046.pcdn.co/wp-content/uploads/gravatar/danielcalbimonte.jpg)
- Otázky k pohovorům SQL – 3. září, 2020
- Certifikace SQL – 7. srpna 2020
- Historie TSQL – 3. září 2019