Tento článek obsahuje příklady převodu času hodnotu na datum a čas hodnotu v SQL Server.
Když převedete čas hodnotu na datetime , jsou k hodnotě přidány další informace. Důvodem je datum a čas datový typ obsahuje informace o datu i čase. Čas datový typ naproti tomu obsahuje pouze časové informace. Proto se při provádění takového převodu k hodnotě přidávají informace o datu. Konkrétně je datum nastaveno na ‚1900-01-01‘.
Příklad 1 – Explicitní konverze pomocí CAST()
Zde je příklad explicitní konverze. V tomto případě používám CAST()
funkce přímo v SELECT
příkaz explicitně převést z času na datum a čas .
DECLARE @thetime timeSET @thetime ='23:15:59.004007'SELECT @thetime AS 'time', CAST(@thetime AS datetime) AS 'datetime';
Výsledek:
+------------------+-------------------------+| čas | datum a čas ||------------------+-------------------------|| 23:15:59.0040070 | 1900-01-01 23:15:59.003 |+------------------+------------------- ------+
Při převodu z času na datum a čas , komponenta data je nastavena na 1900-01-01
.
Všimněte si také, že samotná časová hodnota je v obou těchto typech dat prezentována odlišně. Čas datový typ přidá na konec nulu (protože má vyšší přesnost – jeho výchozí měřítko je 7). Na druhé straně datum a čas hodnoty používají nižší stupnici a jsou zaokrouhleny na přírůstky 0,000, 003 nebo 0,007 sekund. Pokud to považujete za problematické, zvažte převod na datetime2 namísto.
Příklad 2 – Nižší přesnost/měřítko
V předchozím příkladu čas hodnota měla vyšší přesnost ve zlomcích sekund než datum a čas hodnota. Je to proto, že používá výchozí stupnici 7. V případě potřeby ji však můžeme změnit na nižší hodnotu.
Aby bylo jasno, škálování je počet číslic napravo od desetinné čárky v čísle. Přesnost je celkový počet číslic v čísle. Měřítko můžeme určit připojením čísla v závorce k datovému typu.
Zde je to, co se stane, když výslovně nastavím čas hodnotu mít nižší měřítko než datum a čas hodnota.
DECLARE @thetime time(0)SET @thetime ='23:15:59.004007'SELECT @thetime AS 'time', CAST(@thetime AS datetime) AS 'datetime';
Výsledek:
+----------+-------------------------+| čas | datum a čas ||----------+-------------------------|| 23:15:59 | 1900-01-01 23:15:59.000 |+----------+-------------------------+Příklad 3 – Explicitní převod pomocí CONVERT()
Toto je stejné jako v prvním příkladu, ale tentokrát používám
CONVERT()
funkce namístoCAST()
.DECLARE @thetime timeSET @thetime ='23:15:59.004007'SELECT @thetime AS 'time', CONVERT(datetime, @thetime) AS 'datetime';Výsledek:
+------------------+-------------------------+| čas | datum a čas ||------------------+-------------------------|| 23:15:59.0040070 | 1900-01-01 23:15:59.003 |+------------------+------------------- ------+Příklad 4 – Implicitní konverze
Zde je příklad provedení stejné věci, ale s použitím implicitní konverze typu.
DECLARE @thetime time, @thedatetime datetimeSET @thetime ='23:15:59.004007'SET @thedatetime =@thetimeSELECT @thetime JAKO 'čas', @thedatetime JAKO 'datetime';Výsledek:
+------------------+-------------------------+| čas | datum a čas ||------------------+-------------------------|| 23:15:59.0040070 | 1900-01-01 23:15:59.003 |+------------------+------------------- ------+Dostaneme tedy stejný výsledek, bez ohledu na to, zda se jedná o explicitní nebo implicitní konverzi.
Toto je implicitní převod, protože k jeho explicitnímu převodu nepoužíváme konverzní funkci. Jednoduše přiřadíme hodnotu z proměnné jednoho datového typu k proměnné jiného datového typu. V tomto případě SQL Server provede implicitní převod za scénou, když se pokusíme přiřadit čas hodnotu na datum a čas proměnná.
Příklad 5 – Změna data
Pokud potřebujete změnit datum (ale zachovat stejný čas), můžete použít
DATEADD()
funkce.DECLARE @thetime time, @thedatetime datetimeSET @thetime ='23:15:59.004007'SET @thedatetime =@thetimeSET @thedatetime =DATEADD(rok, 120, @thedatetime)SELECT @thetime AS 'time', @thedatetime AS 'datetime';Výsledek:
+------------------+-------------------------+| čas | datum a čas ||------------------+-------------------------|| 23:15:59.0040070 | 2020-01-01 23:15:59.003 |+------------------+------------------- ------+V tomto případě přidám 120 k hodnotě roku, čímž se dostaneme do roku 2020.