sql >> Database teknologi >  >> RDS >> Sqlserver

Konverter 'datetime offset' til 'date' i SQL Server (T-SQL-eksempler)

Hvis du har en datetime offset værdi, men du behøver ikke tids- og tidszoneforskydningsdelen, der konverterer den til dato vil spare dig for en masse lagerplads (mens du fjerner unødvendige detaljer fra værdien). Denne artikel indeholder eksempler på konvertering af en datotidsforskydning værdi til en dato værdi i SQL Server.

datetime offset datatypen inkluderer dato og klokkeslæt med en tidszoneforskydning. Den har også en brøksekundersdel mellem 0 og 7 (dette afhænger af, hvor mange brøksekunder der er tildelt den). Dette gøres ved at bruge datetimeoffset(n) syntaks. Hvis du ikke angiver dette, vil det bruge 7 (standard). Denne datatypes lagerstørrelse er enten 8, 9 eller 10 bytes (plus 1 byte til at gemme præcisionen), afhængigt af den anvendte præcision. Dens nøjagtighed er 100 nanosekunder.

datoen datatype på den anden side, inkluderer kun datoen. Den inkluderer ikke tiden, og den har en nøjagtighed på 1 dag. Den bruger 3 bytes til lagring.

Når du konverterer en datotidsforskydning værdi til en dato datatype, mister du tidsdelen (inklusive tidszoneforskydningen). Du reducerer dog også lagerstørrelsen ned til faste 3 bytes. Selvfølgelig vil du kun foretage denne konvertering, hvis du ikke har brug for tidsdelen og tidszoneforskydningen.

Eksempel 1 – Implicit konvertering

Her er et eksempel på en implicit konvertering mellem datetime offset og dato .

DECLARE 
  @thedatetimeoffset datetimeoffset, 
  @thedate date;
SET @thedatetimeoffset = '2025-05-21 10:15:30.1234567 +10:30';
SET @thedate = @thedatetimeoffset;
SELECT 
  @thedatetimeoffset AS 'datetimeoffset',
  @thedate AS 'date';

Resultat:

+------------------------------------+------------+
| datetimeoffset                     | date       |
|------------------------------------+------------|
| 2025-05-21 10:15:30.1234567 +10:30 | 2025-05-21 |
+------------------------------------+------------+

Dette er en implicit konvertering, fordi vi ikke bruger en konverteringsfunktion (som dem nedenfor) til eksplicit at konvertere den. I dette tilfælde udfører SQL Server en implicit konvertering bag kulisserne, når vi forsøger at tildele datetime offset værdi til en dato variabel.

Her kan vi se, at datoen værdien inkluderer kun datoen (uden tidskomponenten). Tidskomponenten, inklusive dens tidszoneforskydning, er blevet fjernet fra værdien.

I dette eksempel er datetime offset værdi bruger standardpræcisionen (hvilket resulterer i 7 decimaler). Dette resulterer i, at datatypen bruger 10 bytes (faktisk 11 bytes, hvis du tæller den ekstra byte, der gemmer præcisionen). datoen værdi bruger kun 3 bytes.

Eksempel 2 – Eksplicit konvertering ved hjælp af CAST()

Her er et eksempel på en eksplicit konvertering. I dette tilfælde bruger jeg CAST() funktion direkte i SELECT sætning til eksplicit at konvertere mellem datetimeoffset og dato .

DECLARE @thedatetimeoffset datetimeoffset;
SET @thedatetimeoffset = '2025-05-21 10:15:30.1234567 +10:30';
SELECT 
  @thedatetimeoffset AS 'datetimeoffset',
  CAST(@thedatetimeoffset AS date) AS 'date'; 

Resultat:

+------------------------------------+------------+
| datetimeoffset                     | date       |
|------------------------------------+------------|
| 2025-05-21 10:15:30.1234567 +10:30 | 2025-05-21 |
+------------------------------------+------------+

Eksempel 3 – Eksplicit konvertering ved hjælp af CONVERT()

Her er et eksempel på en eksplicit konvertering ved hjælp af CONVERT() funktion i stedet for CAST() .

DECLARE @thedatetimeoffset datetimeoffset;
SET @thedatetimeoffset = '2025-05-21 10:15:30.1234567 +10:30';
SELECT 
  @thedatetimeoffset AS 'datetimeoffset',
  CONVERT(date, @thedatetimeoffset) AS 'date';

Resultat:

+------------------------------------+------------+
| datetimeoffset                     | date       |
|------------------------------------+------------|
| 2025-05-21 10:15:30.1234567 +10:30 | 2025-05-21 |
+------------------------------------+------------+

  1. Et tabelnavn som en variabel

  2. Sådan undertrykkes INFO-meddelelser, når du kører psql-scripts

  3. Oracle SQL rækkefølge efter i underforespørgselsproblemer!

  4. MySQL IN-operatørens ydeevne på (stort?) antal værdier