sql >> Database >  >> RDS >> Sqlserver

Fix Msg 241 "Conversie mislukt bij het converteren van datum en/of tijd van tekenreeks" in SQL Server

Als u SQL Server-foutbericht 241 krijgt met de tekst Conversie mislukt bij het converteren van datum en/of tijd van tekenreeks , komt dat waarschijnlijk omdat u een tekenreeks probeert om te zetten naar een datum/tijd-waarde, maar die specifieke tekenreeks niet kan worden geconverteerd naar een datum/tijd-waarde.

Voorbeeld van fout

Hier is een voorbeeld van code die de fout veroorzaakt:

SELECT CAST('Tomorrow' AS date);

Resultaat:

Msg 241, Level 16, State 1, Line 1
Conversion failed when converting date and/or time from character string.

Hier hebben we geprobeerd de tekenreeks Tomorrow . te converteren naar de date typ, maar Tomorrow is geen geldige datum die kan worden omgezet in een date typ.

SQL Server kan de string niet converteren naar een date en dus gaf het een fout terug.

Oplossing 1

De meest voor de hand liggende manier om dit op te lossen, is door de tekenreeks te wijzigen zodat deze lijkt op een werkelijke datum.

Als je een kolom passeert, controleer dan of je de juiste kolom hebt. Hetzelfde als je een variabele doorgeeft - controleer of het de juiste variabele is.

De volgende conversie slaagt bijvoorbeeld:

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

Resultaat:

2030-02-20

Afhankelijk van het formaat van de invoerdatum, kunt u wellicht beter de CONVERT() gebruiken functie, zodat u het formaat van de invoerdatumuitdrukking kunt specificeren.

Voorbeeld:

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

Resultaat:

+-------------------+----------------------+------------------------+----------------------+
| US with century   | US without century   | British with century   | US without century   |
|-------------------+----------------------+------------------------+----------------------|
| 2030-03-02        | 2030-03-02           | 2030-02-03             | 2030-02-03           |
+-------------------+----------------------+------------------------+----------------------+

Oplossing 2

Een andere manier om met de fout om te gaan, is door TRY_CAST() . te gebruiken of TRY_CONVERT() . Deze functies retourneren NULL in plaats van de fout.

Voorbeeld:

SELECT TRY_CAST('Tomorrow' AS date);

Resultaat:

NULL

Dit lost echter niet noodzakelijk het onderliggende probleem op, het verbergt het alleen. De conversie kon nog steeds niet plaatsvinden.

In elk geval kan het nog steeds een haalbare optie zijn, afhankelijk van uw behoeften.

Oplossing 3

Een andere manier om met de fout om te gaan, is door de tekenreeks naar een ander gegevenstype te converteren. Dit is natuurlijk niet goed als je wilt eindigen met een date type, maar misschien is de fout ontstaan ​​omdat je per ongeluk date hebt opgegeven type in plaats van het andere type.

Voorbeeld:

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

Resultaat:

Wed

  1. Stel optie 9 in in SQL Server opgeslagen procedure met behulp van WinHttp.WinHttpRequest.5.1 voor TLS 1.2

  2. Generate_series in Postgres vanaf begin- en einddatum in een tabel

  3. Dubbele sleutels retourneren van een JSON-document in SQL Server

  4. Maanden aftrekken van een datum in PostgreSQL