sql >> Databasteknik >  >> RDS >> Sqlserver

Konvertera 'datetime2' till 'datetime' i SQL Server (T-SQL-exempel)

Det finns förmodligen väldigt få användningsfall som skulle få dig att konvertera en datetime2 värde till datetime i SQL Server. I synnerhet datetime2 datatypen kan ställas in för att använda samma lagringsstorlek som datetime , men med högre precision. Så i de flesta fall skulle du ha det bättre med datetime2 än med en datumtid . Microsoft rekommenderar också att du använder datetime2 istället för datumtid .

Men om du hamnar i situationen där du behöver utföra denna konvertering innehåller den här artikeln några exempel och överväganden som kan vara till hjälp.

När du konverterar en datetime2 värde till datetime , kommer det resulterande värdet att bero på de bråkdelar av sekunder som tilldelades datetime2 värde, såväl som dess precision.

datetime2 datatyp låter dig ange en bråkdelssekunderprecision från 0 till 7. Om du inte anger detta kommer den att använda 7 (standard).

datetime datatyp å andra sidan har högst 3 siffror för sin del av bråkdelssekunder. Dess noggrannhet är avrundad till steg om 0,000, 0,003 eller 0,007 sekunder.

Därför, om datetime2 använder en skala på 3, kommer det resulterande värdet att vara mycket nära (om inte identiskt) med det ursprungliga värdet. Men på grund av den lägre noggrannheten för datetime , kan resultaten bli annorlunda på grund av den avrundning som den utför.

Exempel 1 – Implicit konvertering

Här är ett exempel på en implicit konvertering mellan datetime2 och datumtid .

DECLARE 
  @thedatetime2 datetime2, 
  @thedatetime datetime;
SET @thedatetime2 = '2025-05-21 10:15:30.1234567';
SET @thedatetime = @thedatetime2;
SELECT 
  @thedatetime2 AS 'datetime2',
  @thedatetime AS 'datetime';

Resultat:

+-----------------------------+-------------------------+
| datetime2                   | datetime                |
|-----------------------------+-------------------------|
| 2025-05-21 10:15:30.1234567 | 2025-05-21 10:15:30.123 |
+-----------------------------+-------------------------+

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 datetime2 värde till en datumtid variabel.

Vi kan se att datetime variabeln har mindre bråksekundersprecision, och vi slutar med en bråkdel av 123 även om den ursprungliga bråkdelen var 1234567 .

I det här fallet utfördes ingen avrundning.

Exempel 2 – Precision/noggrannhet och avrundning

datetime datatypen avrundas till steg om 0,000, 0,003 eller 0,007 sekunder. Även om du uttryckligen ställer in det till ett annat värde, kommer det att avrundas.

Detta gäller även vid konvertering från en annan datatyp (som det vi gör här).

Här är ett exempel som visar vad jag menar.

DECLARE 
  @thedatetime2 datetime2, 
  @thedatetime datetime;
SET @thedatetime2 = '2025-05-21 10:15:30.1256789';
SET @thedatetime = @thedatetime2;
SELECT 
  @thedatetime2 AS 'datetime2',
  @thedatetime AS 'datetime';

Resultat:

+-----------------------------+-------------------------+
| datetime2                   | datetime                |
|-----------------------------+-------------------------|
| 2025-05-21 10:15:30.1256789 | 2025-05-21 10:15:30.127 |
+-----------------------------+-------------------------+

I det här exemplet ställer jag in bråkdelssekunderna för datetime2 värde till 1256789 men datumtid rundade det upp till 127 (eftersom det bara kan avrundas till steg om 0,000, 0,003 eller 0,007 sekunder).

Det är viktigt att notera att detta fortfarande kommer att vara sant, även om vi tilldelar datetime2 endast 3 bråkdelar av sekunder. värde.

Exempel:

DECLARE 
  @thedatetime2 datetime2(3), 
  @thedatetime datetime;
SET @thedatetime2 = '2025-05-21 10:15:30.125';
SET @thedatetime = @thedatetime2;
SELECT 
  @thedatetime2 AS 'datetime2',
  @thedatetime AS 'datetime';

Resultat:

+-------------------------+-------------------------+
| datetime2               | datetime                |
|-------------------------+-------------------------|
| 2025-05-21 10:15:30.125 | 2025-05-21 10:15:30.127 |
+-------------------------+-------------------------+

Det lönar sig också att vara medveten om eventuell avrundning som kan inträffa till den ursprungliga datetime2 värde. datetime2 värdet kan i sig avrundas uppåt om vi försöker tilldela ett värde med fler bråkdelar av sekunder än dess egen skala.

Exempel:

DECLARE 
  @thedatetime2 datetime2(3), 
  @thedatetime datetime;
SET @thedatetime2 = '2025-05-21 10:15:30.1256789';
SET @thedatetime = @thedatetime2;
SELECT 
  @thedatetime2 AS 'datetime2',
  @thedatetime AS 'datetime';

Resultat:

+-------------------------+-------------------------+
| datetime2               | datetime                |
|-------------------------+-------------------------|
| 2025-05-21 10:15:30.126 | 2025-05-21 10:15:30.127 |
+-------------------------+-------------------------+

I det här fallet försöker jag tilldela ett värde med en bråkdel av 1256789 . Men eftersom datetime2(3) värdet har bara en skala på 3, det kan bara stödja 3 decimaler, och i det här fallet avrundas den sista siffran uppåt (eftersom följande siffra är 5 eller högre).

Båda datetime2(3) och datumtid använda samma mängd lagringsutrymme (8 byte). datetime2(3) datatypen använder faktiskt 7 byte för att lagra data, men extra 1 byte för att lagra precisionen.

Exempel 3 – 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 datetime2 och datumtid .

DECLARE @thedatetime2 datetime2;
SET @thedatetime2 = '2025-05-21 10:15:30.1234567';
SELECT 
  @thedatetime2 AS 'datetime2',
  CAST(@thedatetime2 AS datetime) AS 'datetime';

Resultat:

+-----------------------------+-------------------------+
| datetime2                   | datetime                |
|-----------------------------+-------------------------|
| 2025-05-21 10:15:30.1234567 | 2025-05-21 10:15:30.123 |
+-----------------------------+-------------------------+

Exempel 4 – Explicit konvertering med CONVERT()

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

DECLARE @thedatetime2 datetime2;
SET @thedatetime2 = '2025-05-21 10:15:30.1234567';
SELECT 
  @thedatetime2 AS 'datetime2',
  CONVERT(datetime, @thedatetime2) AS 'datetime';

Resultat:

+-----------------------------+-------------------------+
| datetime2                   | datetime                |
|-----------------------------+-------------------------|
| 2025-05-21 10:15:30.1234567 | 2025-05-21 10:15:30.123 |
+-----------------------------+-------------------------+

  1. konvertering av en varchar-datatyp till en datetime-datatyp resulterade i ett värde utanför intervallet

  2. Installation av RODBC/ROracle-paket på OS X Mavericks

  3. SQL Server CASE-uttryck

  4. mysql-transaktion - återställ alla undantag