sql >> Databasteknik >  >> RDS >> Sqlserver

Exempel på att konvertera "datum" till "datetimeoffset" i SQL Server (T-SQL)

Den här artikeln innehåller exempel på hur du konverterar ett datum värde till en datetimeoffset värde i SQL Server.

När du konverterar ett datum värde till datetimeoffset , extra information läggs till värdet. Detta beror på att datetime offset datatypen innehåller både datum- och tidsinformation, såväl som information om tidsförskjutning. Med andra ord, datetime offset datatyp definierar ett datum som kombineras med en tid på dagen som har tidszonsmedvetenhet och är baserad på en 24-timmarsklocka. datumet datatyp, å andra sidan, innehåller endast datuminformation.

När vi konverterar från datum till datetimeoffset , läggs tiden (och tidszonsförskjutningen) automatiskt till värdet. Du kan dock alltid ändra värdet vid behov (inklusive tidszonsförskjutningen).

datetimeoffset datatyp låter dig också ange bråksekundersprecisionen. Om du inte anger detta använder den en skala på 7. Det betyder att den kommer att inkludera 7 siffror på höger sida om decimaltecknet.

Exempel 1 – Implicit konvertering

Här är ett exempel på en implicit konvertering mellan datum och datumtidsförskjutning .

DECLARE @thedate date, @thedatetimeoffset datetimeoffset(7)
SET @thedate = '2020-12-01'
SET @thedatetimeoffset = @thedate
SELECT 
  @thedate AS 'date',
  @thedatetimeoffset AS 'datetimeoffset';

Resultat:

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

Detta är en implicit konvertering eftersom vi inte använder en konverteringsfunktion (som de nedan) för att explicit konvertera den. I det här fallet utför SQL Server en implicit konvertering bakom kulisserna när vi försöker tilldela datumet värde till en datetimeoffset variabel.

Vi kan se att datumet variabeln innehåller endast datuminformation, medan datetime offset variabeln innehåller information om datum, tid och tidszonsförskjutning.

När du konverterar mellan datum och datetimeoffset(7) (dvs. med en skala på 7), är tidskomponenten inställd på 00:00:00.0000000 +00:00 . Detta är också standardvärdet, så du kan utelämna precisionsvärdet och det kommer att använda en skala på 7 (vilket resulterar i en precision på 34). Du kan minska precisionen om du föredrar det. Att minska precisionen kan också minska mängden utrymme som krävs för att lagra värdet.

Bara för att vara tydlig, skala är antalet siffror till höger om decimalkomma i ett tal. Precision är det totala antalet siffror i numret.

Exempel 2 – Explicit konvertering med CAST()

Här är ett exempel på en explicit konvertering. I det här fallet använder jag CAST() funktion direkt inom SELECT uttalande för att uttryckligen konvertera mellan datum och datumtidsförskjutning .

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

Resultat:

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

Så vi får samma resultat som den implicita konverteringen.

Vi kan också justera tiden så här:

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

Resultat:

+------------+------------------------------------+
| date       | datetimeoffset                     |
|------------+------------------------------------|
| 2020-12-01 | 2020-12-01 07:00:00.0000000 +00:00 |
+------------+------------------------------------+

Observera att du inte kan använda DATEADD() funktion för att ändra tidsförskjutningskomponenten. Men oroa dig inte, det finns ett sätt att ändra det (läs vidare för att ta reda på hur).

Exempel 3 – Explicit konvertering med CONVERT()

Här är ett exempel på en explicit konvertering med CONVERT() funktion istället för CAST() .

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

Resultat:

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

Och justera tiden:

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

Resultat:

+------------+------------------------------------+
| date       | datetimeoffset                     |
|------------+------------------------------------|
| 2020-12-01 | 2020-12-01 07:00:00.0000000 +00:00 |
+------------+------------------------------------+

Exempel 4 – Ändra tidsförskjutningen

I de tidigare exemplen använde vi DATEADD() funktion för att ändra tidsvärdet. Den här funktionen kan användas för att ändra vilken del av datum- eller tidskomponenten som helst, förutom tidsförskjutningskomponenten .

Om du behöver ändra tidsförskjutningen kan du använda TODATETIMEOFFSET() fungera. Du kan också använda den här funktionen för att konvertera det ursprungliga datumet värde till en datetimeoffset värde. Den här funktionen accepterar ett datumvärde (som kan lösas till ett datetime2). värde), och ett offsetvärde.

Här är ett exempel:

DECLARE @thedate date, @thedatetimeoffset datetimeoffset
SET @thedate = '2020-12-01'
SET @thedatetimeoffset = TODATETIMEOFFSET(@thedate, '+07:00')
SELECT 
  @thedate AS 'date',
  @thedatetimeoffset AS 'datetimeoffset';

Resultat:

+------------+------------------------------------+
| date       | datetimeoffset                     |
|------------+------------------------------------|
| 2020-12-01 | 2020-12-01 00:00:00.0000000 +07:00 |
+------------+------------------------------------+

Och här är ett exempel med funktionen i SELECT uttalande:

DECLARE @thedate date = '2020-12-01'
SELECT 
  @thedate AS 'date',
  TODATETIMEOFFSET(@thedate, '+07:00') AS 'datetimeoffset';

Resultat:

+------------+------------------------------------+
| date       | datetimeoffset                     |
|------------+------------------------------------|
| 2020-12-01 | 2020-12-01 00:00:00.0000000 +07:00 |
+------------+------------------------------------+

TODATETIMEOFFSET() funktionen accepterar även en datumtidsförskjutning värde som dess första parameter, så du kan också använda den för att ändra befintlig datumtidsförskjutning värden vid behov.

Exempel:

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';

Resultat:

+------------+------------------------------------+------------------------------------+
| date       | datetimeoffset                     | Modified                           |
|------------+------------------------------------+------------------------------------|
| 2020-12-01 | 2020-12-01 00:00:00.0000000 +00:00 | 2020-12-01 00:00:00.0000000 +07:00 |
+------------+------------------------------------+------------------------------------+

  1. Java JDBC-åtkomst nekad för användaren

  2. Förbättra frågehastighet:enkelt SELECT i stora postgres-tabellen

  3. SQLite användarbehörigheter

  4. Prestandagränser för logiska replikeringslösningar