sql >> Databáze >  >> RDS >> Sqlserver

Převést „čas“ na „datetime2“ v SQL Server (příklady T-SQL)

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ísto CAST() .

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.


  1. Vrátit typ tabulky z funkce A v PostgreSQL

  2. Nechte se zapálit pomocí Apache Spark – část 1

  3. Jak změnit sloupec a změnit výchozí hodnotu?

  4. Postgres - VYTVOŘTE TABULKU Z VÝBĚRU