Tento článek obsahuje příklady převodu času hodnotu na datetime2 hodnotu v SQL Server.
Když převedete čas hodnotu na datetime2 , jsou k hodnotě přidány další informace. Důvodem je datetime2 datový typ obsahuje informace o datu i čase. Čas datový typ naproti tomu obsahuje pouze časové informace.
Přesněji řečeno, datum je nastaveno na „1900-01-01“ (pokud se náhodou nezaokrouhlí nahoru na „1900-01-02“), zkopíruje se časová složka a podle dokumentace společnosti Microsoft se posune časové pásmo je nastaveno na 00:00 (i když datetime2 datový typ nezná časové pásmo a nezachovává žádný posun časového pásma).
Když je přesnost datetime2(n) na zlomky sekund hodnota je větší než čas(n) hodnota, hodnota se zaokrouhlí nahoru.
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 do datetime2 .
DECLARE @thetime time;SET @thetime ='23:15:59.004007';SELECT @thetime AS 'time', CAST(@thetime AS datetime2) AS 'datetime2';
Výsledek:
+------------------+--------------------------- --+| čas | datetime2 ||------------------+---------------------------- -|| 23:15:59.0040070 | 1900-01-01 23:15:59.0040070 |+-------------------+------------------- ----------+
Při převodu z času do datetime2 , je přidána komponenta data a nastavena na 1900-01-01
.
Existují však scénáře, kdy lze datum zaokrouhlit nahoru na 1900-01-02
. To bude záviset na zlomcích sekund a na tom, jakou přesnost použijete. Podívejte se níže na příklad tohoto.
Příklad 2 – Přesnost na zlomky sekund
Můžete získat různé výsledky v závislosti na přesnosti ve zlomcích sekund, která je přiřazena každému datovému typu. To bude záviset na skutečné hodnotě zlomkové části.
V předchozím příkladu oba datové typy používaly stejnou přesnost ve zlomcích sekund. Je to proto, že jsem nespecifikoval měřítko (pro definování jejich přesnosti), a proto oba použili své výchozí hodnoty měřítka (oba jsou náhodou 7).
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.
Každopádně v tomto příkladu jsem počáteční hodnotě přiřadil pouze 6 desetinných míst, proto je na konec přidána nula.
Co se stane, když pro čas zadám vyšší přesnost hodnotu ve srovnání s datetime2 hodnota:
DECLARE @thetime time(7);SET @thetime ='23:15:59.1234567';SELECT @thetime AS 'time', CAST(@thetime AS datetime2(4)) AS 'datetime2(4)';Výsledek:
+------------------+--------------------------+ | čas | datetime2(4) ||------------------+-------------------------- -|| 23:15:59,1234567 | 1900-01-01 23:15:59.1235 |+------------------+------------------- -------+Zadáním měřítka od 4 do datetime2 hodnotu, výsledek se zmenší na 4 desetinná místa a v tomto případě se zaokrouhlí nahoru.
Jak byste mohli očekávat, není to jen zlomková část, která může být zaokrouhlena nahoru. Zde je příklad, kdy zlomková část způsobí zaokrouhlení minut a sekund nahoru:
DECLARE @thetime time(7);SET @thetime ='23:15:59.7654321';SELECT @thetime AS 'time', CAST(@thetime AS datetime2(0)) AS 'datetime2(0)';Výsledek:
+------------------+---------------------+| čas | datetime2(0) ||------------------+---------------------|| 23:15:59,7654321 | 1900-01-01 23:16:00 |+------------------+-------------------- --+Změnou přesnosti však můžete pro stejná data získat různé výsledky. Pokud zvýšíme přesnost, byť jen o jedno desetinné místo, dostaneme toto:
DECLARE @thetime time(7);SET @thetime ='23:15:59.7654321';SELECT @thetime AS 'time', CAST(@thetime AS datetime2(1)) AS 'datetime2(1)';Výsledek:
+------------------+-----------------------+| čas | datetime2(1) ||------------------+-----------------------|| 23:15:59,7654321 | 1900-01-01 23:15:59.8 |+------------------+------------------- ----+Takže v tomto případě minuty a sekundy nebyly zaokrouhleno nahoru (ale milisekundy byly ).
Pokud nastavím čas, stane se toto hodnotu, chcete-li použít stupnici s nižší přesností než datetime2 hodnota.
DECLARE @thetime time(0);SET @thetime ='23:15:59.004007';SELECT @thetime AS 'time', CAST(@thetime AS datetime2) AS 'datetime2';Výsledek:
+----------+-----------------------------+| čas | datetime2 ||----------+-----------------------------|| 23:15:59 | 1900-01-01 23:15:59.0000000 |+----------+---------------------------- --+A když už jsme u toho, zde je příklad toho, kdy naše přesné měřítko může vést k tomu, že zlomkové sekundy způsobí zaokrouhlení data na další den:
DECLARE @thetime time(7);SET @thetime ='23:59:59.9999999';SELECT @thetime AS 'time', CAST(@thetime AS datetime2(0)) AS 'datetime2(0)';Výsledek:
+------------------+---------------------+| čas | datetime2(0) ||------------------+---------------------|| 23:59:59,9999999 | 1900-01-02 00:00:00 |+------------------+-------------------- --+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 time;SET @thetime ='23:15:59.004007';SELECT @thetime AS 'time', CONVERT(datetime2, @thetime) AS 'datetime2';Výsledek:
+------------------+--------------------------- --+| čas | datetime2 ||------------------+---------------------------- -|| 23:15:59.0040070 | 1900-01-01 23:15:59.0040070 |+-------------------+------------------- ----------+Příklad 4 – Implicitní konverze
Zde je příklad provedení stejné věci, ale s použitím implicitní konverze typu.
DECLARE @thetime time, @thedatetime2 datetime2;SET @thetime ='23:15:59.004007';SET @thedatetime2 =@thetime;SELECT @thetime AS 'time', @thedatetime2 AS 'datetime2';Výsledek:
+------------------+--------------------------- --+| čas | datetime2 ||------------------+---------------------------- -|| 23:15:59.0040070 | 1900-01-01 23:15:59.0040070 |+-------------------+------------------- ----------+Dostaneme tedy stejný výsledek bez ohledu na to, zda se jedná o explicitní nebo implicitní konverzi.
Jedná se o 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 datetime2 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, @thedatetime2 datetime2;SET @thetime ='23:15:59.004007';SET @thedatetime2 =@thetime;SET @thedatetime2 =DATEADD(year, 120, @thedatetime2);SELECT @thetime AS ' time', @thedatetime2 AS 'datetime2';Výsledek:
+------------------+--------------------------- --+| čas | datetime2 ||------------------+---------------------------- -|| 23:15:59.0040070 | 2020-01-01 23:15:59.0040070 |+-------------------+------------------- ----------+V tomto případě přidám 120 k hodnotě roku, čímž se dostaneme do roku 2020.