sql >> Databasteknik >  >> RDS >> Sqlserver

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

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

När du konverterar ett datum värde till smalldatetime , extra information läggs till värdet. Detta beror på att smalldatetime datatypen innehåller information om både datum och tid. datumet datatyp, å andra sidan, innehåller endast datuminformation.

Det finns dock fall där ett datum till smalldatetime konverteringen kan misslyckas. I synnerhet om datumet värdet är utanför intervallet som stöds av smalldatetime då kommer det att misslyckas med ett fel.

Hur som helst, nedan är exempel på konvertering mellan dessa två datatyper.

Exempel 1 – Implicit konvertering

Här är ett exempel på en implicit konvertering mellan datum och smalldatetime .

DECLARE @thedate date, @thesmalldatetime smalldatetime
SET @thedate = '2020-12-01'
SET @thesmalldatetime = @thedate
SELECT 
  @thedate AS 'date',
  @thesmalldatetime AS 'smalldatetime';

Resultat:

+------------+---------------------+
| date       | smalldatetime       |
|------------+---------------------|
| 2020-12-01 | 2020-12-01 00: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 smalldatetime variabel.

Vi kan se att datumet variabeln innehåller endast datuminformation, medan smalldatetime variabeln innehåller information om både datum och tid.

När du konverterar mellan datum och smalldatetime , är tidskomponenten inställd på 00:00:00 . Detta ger en noggrannhet på minut.

Anledningen till att allt är nollor är att datumvärdet inte innehåller någon tidsinformation, så det finns inget sätt för SQL Server att veta vilken tid du vill ha (om någon).

Naturligtvis får du också detta resultat även om du helt enkelt tilldelar ett värde endast för datum till en smalldatetime utan att utföra en konvertering:

DECLARE @thesmalldatetime smalldatetime = '2020-12-01'
SELECT @thesmalldatetime AS 'smalldatetime';

Resultat:

+---------------------+
| smalldatetime       |
|---------------------|
| 2020-12-01 00:00:00 |
+---------------------+

Exempel 2 – Ändra tiden

Om du behöver ange en tid (men behålla samma datum), kan du använda DATEADD() funktion för att göra just det.

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

Resultat:

+------------+---------------------+
| date       | smalldatetime       |
|------------+---------------------|
| 2020-12-01 | 2020-12-01 07:00:00 |
+------------+---------------------+

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 datum och smalldatetime .

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

Resultat:

+------------+---------------------+
| date       | smalldatetime       |
|------------+---------------------|
| 2020-12-01 | 2020-12-01 00:00:00 |
+------------+---------------------+

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 smalldatetime)) AS 'smalldatetime';

Resultat:

+------------+---------------------+
| date       | smalldatetime       |
|------------+---------------------|
| 2020-12-01 | 2020-12-01 07:00:00 |
+------------+---------------------+

Exempel 4 – 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(smalldatetime, @thedate) AS 'smalldatetime';

Resultat:

+------------+---------------------+
| date       | smalldatetime       |
|------------+---------------------|
| 2020-12-01 | 2020-12-01 00:00:00 |
+------------+---------------------+

Och justera tiden:

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

Resultat:

+------------+---------------------+
| date       | smalldatetime       |
|------------+---------------------|
| 2020-12-01 | 2020-12-01 07:00:00 |
+------------+---------------------+

Exempel 5 – Fel utanför intervallet

Som nämnts, om datumet ligger utanför intervallet som stöds av smalldatetime datatyp får du ett felmeddelande.

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

Resultat:

The conversion of a date data type to a smalldatetime data type resulted in an out-of-range value.

smalldatetime datatypen stöder endast datumintervallen 1900-01-01 till 2079-06-06.

Även smalldatetime datatypen stöder endast tidsintervallen 00:00:00 till 23:59:59, så du får också ett felmeddelande om du försöker använda ett värde utanför det intervallet (till exempel med högre precision).

Exempel:

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

Resultat:

The datepart nanosecond is not supported by date function dateadd for data type smalldatetime.

Men i det här fallet är det inte ett fel vid konvertering, det är faktiskt ett fel när du använder DATEADD() funktion (eftersom funktionen inte tillåter att den specifika datumdelen används på en smalldatetime datatyp).


  1. Pyodbc - Datakällans namn hittades inte och ingen standarddrivrutin har angetts

  2. MariaDB JSON_ARRAY() Förklarad

  3. Oracle:Hur tar man reda på om det finns en väntande transaktion?

  4. MOD() Funktion i Oracle