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

Příklady převodu „čas“ na „datum a čas“ v SQL Server (T-SQL)

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

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.


  1. MySQL MariaDB – Dotaz pomocí Temp Table

  2. MySQL ORDER BY IN()

  3. PostgreSQL parametrizované Order By / Limit v tabulkové funkci

  4. Jak mohu vidět dotazy, které jsou prováděny proti Oracle?