Тази статия съдържа примери за преобразуване на дата стойност към datetimeoffset стойност в SQL Server.
Когато конвертирате дата стойност на datetimeoffset , към стойността се добавя допълнителна информация. Това е така, защото datetimeoffset типът данни съдържа както информация за дата и час, така и информация за отместването на времето. С други думи, отместването на датата и времето типът данни дефинира дата, която се комбинира с час от деня, който има осведоменост за часовата зона и се основава на 24-часов часовник. Датата типът данни, от друга страна, съдържа само информация за дата.
Когато преобразуваме от дата до datetimeoffset , времето (и изместването на часовата зона) се добавя автоматично към стойността. Въпреки това, винаги можете да промените стойността, ако е необходимо (включително изместването на часовата зона).
отместването на датата и времето типът данни също ви позволява да зададете точността на частични секунди. Ако не посочите това, той използва мащаб от 7. Това означава, че ще включва 7 цифри от дясната страна на десетичната запетая.
Пример 1 – Неявно преобразуване
Ето пример за имплицитно преобразуване между дата и datetimeoffset .
DECLARE @thedate date, @thedatetimeoffset datetimeoffset(7) SET @thedate = '2020-12-01' SET @thedatetimeoffset = @thedate SELECT @thedate AS 'date', @thedatetimeoffset AS 'datetimeoffset';
Резултат:
+------------+------------------------------------+ | date | datetimeoffset | |------------+------------------------------------| | 2020-12-01 | 2020-12-01 00:00:00.0000000 +00:00 | +------------+------------------------------------+
Това е имплицитно преобразуване, защото не използваме функция за преобразуване (като тези по-долу), за да я преобразуваме изрично. В този случай SQL Server извършва имплицитно преобразуване зад кулисите, когато се опитваме да присвоим дата стойност към datetimeoffset променлива.
Виждаме, че датата променливата съдържа само информация за датата, докато datetimeoffset променливата съдържа информация за дата, час и изместване на часовата зона.
Когато конвертирате между дата и datetimeoffset(7) (т.е. използвайки скала от 7), времевият компонент е настроен на 00:00:00.0000000 +00:00
. Това също е стойността по подразбиране, така че можете да пропуснете стойността на точността и тя ще използва скала от 7 (което води до точност от 34). Можете да намалите точността, ако предпочитате. Намаляването на точността може също да намали количеството пространство, необходимо за съхраняване на стойността.
Само за да е ясно, мащаб е броят на цифрите вдясно от десетичната запетая в число. Прецизност е общият брой цифри в числото.
Пример 2 – Изрично преобразуване с помощта на CAST()
Ето пример за изрично преобразуване. В този случай използвам CAST()
функция директно в SELECT
изявление за изрично преобразуване между дата и datetimeoffset .
DECLARE @thedate date SET @thedate = '2020-12-01' SELECT @thedate AS 'date', CAST(@thedate AS datetimeoffset) AS 'datetimeoffset';
Резултат:
+------------+------------------------------------+ | date | datetimeoffset | |------------+------------------------------------| | 2020-12-01 | 2020-12-01 00:00:00.0000000 +00:00 | +------------+------------------------------------+
Така получаваме същия резултат като имплицитното преобразуване.
Можем също така да коригираме времето по следния начин:
DECLARE @thedate date SET @thedate = '2020-12-01' SELECT @thedate AS 'date', DATEADD(hour, 7, CAST(@thedate AS datetimeoffset)) AS 'datetimeoffset';
Резултат:
+------------+------------------------------------+ | date | datetimeoffset | |------------+------------------------------------| | 2020-12-01 | 2020-12-01 07:00:00.0000000 +00:00 | +------------+------------------------------------+
Имайте предвид, че не можете да използвате DATEADD()
функция за промяна на компонента за отместване на времето. Но не се притеснявайте, има начин да го модифицирате (прочетете, за да разберете как).
Пример 3 – Изрично преобразуване с помощта на CONVERT()
Ето пример за изрично преобразуване с помощта на CONVERT()
функция вместо CAST()
.
DECLARE @thedate date SET @thedate = '2020-12-01' SELECT @thedate AS 'date', CONVERT(datetimeoffset, @thedate) AS 'datetimeoffset';
Резултат:
+------------+------------------------------------+ | date | datetimeoffset | |------------+------------------------------------| | 2020-12-01 | 2020-12-01 00:00:00.0000000 +00:00 | +------------+------------------------------------+
И коригиране на часа:
DECLARE @thedate date SET @thedate = '2020-12-01' SELECT @thedate AS 'date', DATEADD(hour, 7, CONVERT(datetimeoffset, @thedate)) AS 'datetimeoffset';
Резултат:
+------------+------------------------------------+ | date | datetimeoffset | |------------+------------------------------------| | 2020-12-01 | 2020-12-01 07:00:00.0000000 +00:00 | +------------+------------------------------------+
Пример 4 – Промяна на отместването на времето
В предишните примери използвахме DATEADD()
функция за промяна на стойността на времето. Тази функция може да се използва за промяна на всяка част от компонента за дата или час, с изключение на компонента за отместване на времето .
Ако трябва да промените отместването на времето, можете да използвате TODATETIMEOFFSET()
функция. Можете също да използвате тази функция, за да конвертирате оригиналната дата стойност към datetimeoffset стойност. Тази функция приема стойност за дата (която може да се разреши до datetime2 стойност) и стойност на отместване.
Ето един пример:
DECLARE @thedate date, @thedatetimeoffset datetimeoffset SET @thedate = '2020-12-01' SET @thedatetimeoffset = TODATETIMEOFFSET(@thedate, '+07:00') SELECT @thedate AS 'date', @thedatetimeoffset AS 'datetimeoffset';
Резултат:
+------------+------------------------------------+ | date | datetimeoffset | |------------+------------------------------------| | 2020-12-01 | 2020-12-01 00:00:00.0000000 +07:00 | +------------+------------------------------------+
И ето пример за използване на функцията в SELECT
изявление:
DECLARE @thedate date = '2020-12-01' SELECT @thedate AS 'date', TODATETIMEOFFSET(@thedate, '+07:00') AS 'datetimeoffset';
Резултат:
+------------+------------------------------------+ | date | datetimeoffset | |------------+------------------------------------| | 2020-12-01 | 2020-12-01 00:00:00.0000000 +07:00 | +------------+------------------------------------+
TODATETIMEOFFSET()
функцията също така приема отместване на датата и времето стойност като негов първи параметър, така че можете да го използвате и за модифициране на съществуващ datetimeoffset стойности, ако е необходимо.
Пример:
DECLARE @thedate date, @thedatetimeoffset datetimeoffset(7) SET @thedate = '2020-12-01' SET @thedatetimeoffset = @thedate SELECT @thedate AS 'date', @thedatetimeoffset AS 'datetimeoffset', TODATETIMEOFFSET(@thedatetimeoffset, '+07:00') AS 'Modified';
Резултат:
+------------+------------------------------------+------------------------------------+ | date | datetimeoffset | Modified | |------------+------------------------------------+------------------------------------| | 2020-12-01 | 2020-12-01 00:00:00.0000000 +00:00 | 2020-12-01 00:00:00.0000000 +07:00 | +------------+------------------------------------+------------------------------------+