sql >> Databasteknik >  >> RDS >> Sqlserver

Fix Msg 241 "Konvertering misslyckades vid konvertering av datum och/eller tid från teckensträng" i SQL Server

Om du får SQL Server-felmeddelande 241 som lyder Konverteringen misslyckades vid konvertering av datum och/eller tid från teckensträng , det beror förmodligen på att du försöker konvertera en sträng till ett datum-/tidsvärde, men just den strängen kan inte konverteras till ett datum-/tidsvärde.

Exempel på fel

Här är ett exempel på kod som ger felet:

SELECT CAST('Tomorrow' AS date); 

Resultat:

Msg 241, Level 16, State 1, Line 1Conversion misslyckades vid konvertering av datum och/eller tid från teckensträng.

Här försökte vi konvertera strängen Tomorrow till date typ, men Tomorrow är inte ett giltigt datum som kan konverteras till ett date typ.

SQL Server kan inte konvertera strängen till ett date och så det returnerade ett fel.

Lösning 1

Det mest uppenbara sättet att fixa detta är att ändra strängen så att den liknar ett verkligt datum.

Om du klarar en kolumn, kontrollera att du har rätt kolumn. Samma sak om du skickar en variabel – kontrollera att det är rätt variabel.

Till exempel lyckas följande konvertering:

SELECT CAST('20 Feb 2030' AS date); 

Resultat:

2030-02-20

Beroende på formatet för inmatningsdatumet kan det vara bättre att använda CONVERT() funktion, så att du kan ange formatet för inmatningsdatumuttrycket.

Exempel:

SELECT 
    CONVERT(date, '03/02/2030', 101) AS 'US with century',
    CONVERT(date, '03/02/30', 1) AS 'US without century',
    CONVERT(date, '03/02/2030', 103) AS 'British with century',
    CONVERT(date, '03/02/30', 3) AS 'US without century'; 

Resultat:

+--------------------+---------------------+--- --------------------+-----------------------------+| USA med århundrade | USA utan århundrade | Brittisk med århundrade | USA utan århundrade ||------------------------+----------------------------+-- ----------------------+----------------------------|| 2030-03-02 | 2030-03-02 | 2030-02-03 | 2030-02-03 |+--------------------+---------------------------+ ------------------------+------------------------------+ 

Lösning 2

Ett annat sätt att hantera felet är att använda antingen TRY_CAST() eller TRY_CONVERT() . Dessa funktioner returnerar NULL istället för felet.

Exempel:

SELECT TRY_CAST('Tomorrow' AS date); 

Resultat:

NULL

Detta löser dock inte nödvändigtvis det underliggande problemet, det döljer det bara. Konverteringen kunde fortfarande inte ske.

I vilket fall som helst kan det fortfarande vara ett genomförbart alternativ, beroende på dina behov.

Lösning 3

Ett annat sätt att hantera felet är att konvertera strängen till en annan datatyp. Uppenbarligen är detta inte bra om du vill sluta med ett date typ, men felet kanske uppstod för att du av misstag angav date typ istället för den andra typen.

Exempel:

SELECT CAST('Wednesday' AS char(3)); 

Resultat:

ons

  1. Migrera MySQL till PostgreSQL på AWS RDS, del 1

  2. Hur man optimerar MySQL/MariaDB-tabeller

  3. Oracle Index och typer av index i Oracle med exempel

  4. Hur man aktiverar en CHECK-begränsning i SQL Server (T-SQL-exempel)