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

Příklady převodu ‚date‘ na ‚datetime2‘ v SQL Server (T-SQL)

Tento článek obsahuje příklady převodu datum hodnotu na datetime2 hodnotu v SQL Server.

Když převedete datum hodnotu na datetime2 , jsou k hodnotě přidány další informace. Důvodem je datetime2 datový typ obsahuje informace o datu i čase. Datum datový typ na druhé straně obsahuje pouze informace o datu.

datetime2 datový typ je v podstatě rozšířením datetime datový typ. Má větší rozsah dat, větší výchozí zlomkovou přesnost a volitelnou přesnost zadanou uživatelem.

V každém případě je proces převodu naprosto stejný bez ohledu na typ dat. Jediný rozdíl je v množství informací, které jsou k dispozici mezi datem , datum a čas a datetime2 .

Příklad 1 – Implicitní konverze

Zde je příklad implicitní konverze mezi datem a datetime2 .

DECLARE @thedate date, @thedatetime2 datetime2
SET @thedate = '2020-12-01'
SET @thedatetime2 = @thedate
SELECT 
  @thedate AS 'date',
  @thedatetime2 AS 'datetime2';

Výsledek:

+------------+-----------------------------+
| date       | datetime2                   |
|------------+-----------------------------|
| 2020-12-01 | 2020-12-01 00:00:00.0000000 |
+------------+-----------------------------+

Jedná se o implicitní převod, protože k jeho explicitnímu převodu nepoužíváme konverzní funkci (jako jsou ty níže). V tomto případě SQL Server provede implicitní převod za scénou, když se pokusíme přiřadit datum hodnotu na datetime2 proměnná.

Vidíme, že datum proměnná obsahuje pouze informace o datu, zatímco datetime2 proměnná obsahuje informace o datu i čase.

Navíc získáme více informací o čase, než bychom získali, kdybychom je převedli na datetime datový typ.

Při převodu mezi datem a datetime2 pomocí výchozí přesnosti (7) je časová složka nastavena na 00:00:00.0000000 (ve srovnání s 00:00:00.000 pro datum a čas ). Pokud chcete, můžete přesnost snížit (viz níže). Snížení přesnosti může také snížit množství prostoru potřebného k uložení hodnoty.

Důvod, proč je časová složka samé nuly, je ten, že hodnota data neobsahuje žádné časové informace, takže SQL Server nemůže nijak zjistit, jaký čas chcete (pokud nějaký).

Příklad 2 – Úprava času

Pokud potřebujete zadat čas (ale zachovat stejné datum), můžete použít DATEADD() funkce udělat právě to.

DECLARE @thedate date, @thedatetime2 datetime2
SET @thedate = '2020-12-01'
SET @thedatetime2 = @thedate
SET @thedatetime2 = DATEADD(hour, 8, @thedatetime2)
SELECT 
  @thedate AS 'date',
  @thedatetime2 AS 'datetime2';

Výsledek:

+------------+-----------------------------+
| date       | datetime2                   |
|------------+-----------------------------|
| 2020-12-01 | 2020-12-01 08:00:00.0000000 |
+------------+-----------------------------+

Příklad 3 – Explicitní konverze pomocí CAST()

Zde je příklad explicitní konverze. V tomto případě používám CAST() funkce přímo v SELECT k explicitnímu převodu mezi datem a datetime2 .

DECLARE @thedate date
SET @thedate = '2020-12-01'
SELECT 
  @thedate AS 'date',
  CAST(@thedate AS datetime2) AS 'datetime2';

Výsledek:

+------------+-----------------------------+
| date       | datetime2                   |
|------------+-----------------------------|
| 2020-12-01 | 2020-12-01 00:00:00.0000000 |
+------------+-----------------------------+

Dostaneme tedy stejný výsledek jako implicitní převod.

Čas můžeme také upravit takto:

DECLARE @thedate date
SET @thedate = '2020-12-01'
SELECT 
  @thedate AS 'date',
  DATEADD(hour, 8, CAST(@thedate AS datetime2)) AS 'datetime2';

Výsledek:

+------------+-----------------------------+
| date       | datetime2                   |
|------------+-----------------------------|
| 2020-12-01 | 2020-12-01 08:00:00.0000000 |
+------------+-----------------------------+

Příklad 4 – Explicitní převod pomocí CONVERT()

Zde je příklad explicitní konverze pomocí CONVERT() funkce namísto CAST() .

DECLARE @thedate date
SET @thedate = '2020-12-01'
SELECT 
  @thedate AS 'date',
  CONVERT(datetime2, @thedate) AS 'datetime2';

Výsledek:

+------------+-----------------------------+
| date       | datetime2                   |
|------------+-----------------------------|
| 2020-12-01 | 2020-12-01 00:00:00.0000000 |
+------------+-----------------------------+

A úprava času:

DECLARE @thedate date
SET @thedate = '2020-12-01'
SELECT 
  @thedate AS 'date',
  DATEADD(hour, 8, CONVERT(datetime2, @thedate)) AS 'datetime2';

Výsledek:

+------------+-----------------------------+
| date       | datetime2                   |
|------------+-----------------------------|
| 2020-12-01 | 2020-12-01 08:00:00.0000000 |
+------------+-----------------------------+

Příklad 5 – Přesnost

datetime2 datový typ umožňuje určit přesnost (až do výchozích 7). Jinými slovy, pokud nepotřebujete, nemusíte používat celých 7 číslic.

Příklad:

DECLARE @thedate date
SET @thedate = '2020-12-01'
SELECT 
  @thedate AS 'date',
  CONVERT(datetime2(2), @thedate) AS 'datetime2(2)',
  CONVERT(datetime2(4), @thedate) AS 'datetime2(4)';

Výsledek:

+------------+------------------------+--------------------------+
| date       | datetime2(2)           | datetime2(4)             |
|------------+------------------------+--------------------------|
| 2020-12-01 | 2020-12-01 00:00:00.00 | 2020-12-01 00:00:00.0000 |
+------------+------------------------+--------------------------+

Jednou z výhod snížení přesnosti je, že může také snížit množství prostoru potřebného k uložení hodnoty. Konkrétně 6 bajtů pro přesnost menší než 3, 7 bajtů pro přesnost 3 nebo 4 a všechny ostatní přesnosti vyžadují 8 bajtů. Pamatujte však, že první bajt se používá k uložení přesnosti, takže skutečná hodnota je zde uvedená velikost úložiště plus 1 další bajt pro uložení přesnosti.


  1. Jak smazat data z Elastisearch

  2. přístup k aliasům sloupců v klauzuli where v postgresql

  3. Jak získat hodnoty SQLite db v Arraylist do Listview

  4. Android SQlite neaktualizuje data