Tento článek obsahuje příklady převodu datetimeoffset hodnotu na smalldatetime v SQL Serveru.
Když převedete datetimeoffset hodnotu na smalldatetime , datum a hodiny se zkopírují. Minuty jsou zaokrouhleny nahoru (v závislosti na hodnotě sekund) a sekundy jsou nastaveny na 0.
datetimeoffset datový typ umožňuje zadat přesnost na zlomky sekund od 0 do 7. To se provádí pomocí datetimeoffset(n)
syntax. Pokud toto nezadáte, použije se 7 (výchozí). Má také posun časového pásma. Velikost úložiště tohoto typu dat je buď 8, 9 nebo 10 bajtů (plus 1 bajt pro přesnost), v závislosti na použité přesnosti.
smalldatetime datový typ na druhé straně nemá povědomí o časovém pásmu, a proto nezahrnuje žádný posun časového pásma. Také nemá žádné zlomkové sekundy a jeho složka sekund je vždy nastavena na nulu (:00). Jeho přesnost je s přesností na minutu. Velikost úložiště tohoto typu dat je pevně nastavena na 4 bajty.
Příklad 1 – Implicitní konverze
Zde je příklad implicitní konverze mezi datetimeoffset a smalldatetime .
DECLARE @thedatetimeoffset datetimeoffset, @thesmalldatetime smalldatetime;SET @thedatetimeoffset ='2025-05-21 10:15:30.1234567 +07:00';SET @thesmalldatetime =@thedatetimeoffset;VYBRAT @thedatetimeoffsetm AS'SELECT all,datetimetimeoffsm AS 'smalldatetime';
Výsledek:
+------------------------------------+--------- ------------+| datum a čas offset | smalldatetime ||------------------------------------+---------- -----------|| 2025-05-21 10:15:30.1234567 +07:00 | 2025-05-21 10:16:00 |+-------------------------------------+- --------------------+
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 datetimeoffset hodnotu na smalldatetime proměnná.
Vidíme, že smalldatetime proměnná nemá přesnost na zlomky sekund a její sekundy byly nastaveny na nulu. Také minuty byly zaokrouhleny nahoru, protože původní hodnota měla hodnotu sekund 30.
Dalším pozorováním je, že posun časového pásma byl zkrácen – smalldatetime datový typ nemá povědomí o časovém pásmu.
V tomto převodu se velikost úložiště zmenšila z 10 bajtů (11 bajtů, když počítáte přesnost) pro datetimeoffset , na 4 bajty pro smalldatetime .
Příklad 2 – 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 datetimeoffset a smalldatetime .
DECLARE @thedatetimeoffset datetimeoffset;SET @thedatetimeoffset ='2025-05-21 10:15:30.1234567 +07:00';SELECT @thedatetimeoffset AS 'datetimeoffset', CAST(@thedatetimeoffset AS smalldatetimedate) AS ';sm /před>Výsledek:
+------------------------------------+--------- -----------------+| datum a čas offset | smalldatetime ||------------------------------------+---------- ----------------|| 2025-05-21 10:15:30.1234567 +07:00 | 2025-05-21 10:16:00 |+-------------------------------------+- ------------------------+Příklad 3 – Explicitní převod pomocí CONVERT()
Zde je příklad explicitní konverze pomocí
CONVERT()
funkce namístoCAST()
.DECLARE @thedatetimeoffset datetimeoffset;SET @thedatetimeoffset ='2025-05-21 10:15:30.1234567 +07:00';SELECT @thedatetimeoffset AS 'datetimeoffset', CONVERT(smalldatetime, @thedatetimeoffset;všechny datum) AS /před>Výsledek:
+------------------------------------+--------- -----------------+| datum a čas offset | smalldatetime ||------------------------------------+---------- ----------------|| 2025-05-21 10:15:30.1234567 +07:00 | 2025-05-21 10:16:00 |+-------------------------------------+- ------------------------+