sql >> Databáze >  >> RDS >> Sqlserver

Oprava Msg 241 „Převod se nezdařil při převodu data a/nebo času ze znakového řetězce“ v SQL Server

Pokud se vám zobrazuje chybová zpráva SQL Server 241, která zní Konverze se nezdařila při převodu data a/nebo času ze znakového řetězce , je to pravděpodobně proto, že se pokoušíte převést řetězec na hodnotu data/času, ale tento konkrétní řetězec nelze převést na hodnotu data/času.

Příklad chyby

Zde je příklad kódu, který způsobuje chybu:

SELECT CAST('Tomorrow' AS date); 

Výsledek:

Zpráva 241, úroveň 16, stav 1, řádek 1 Převod se nezdařil při převodu data a/nebo času z řetězce znaků.

Zde jsme se pokusili převést řetězec Tomorrow k date zadejte, ale Tomorrow není platné datum, které lze převést na date typ.

SQL Server nemůže převést řetězec na date a tak to vrátilo chybu.

Řešení 1

Nejviditelnějším způsobem, jak to opravit, je změnit řetězec tak, aby se podobal skutečnému datu.

Pokud procházíte kolonou, zkontrolujte, zda máte správný sloupec. Totéž platí, pokud předáváte proměnnou – zkontrolujte, zda se jedná o správnou proměnnou.

Například následující převod je úspěšný:

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

Výsledek:

20. 2. 2030

V závislosti na formátu vstupního data může být lepší použít CONVERT() funkci, abyste mohli určit formát výrazu vstupního data.

Příklad:

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

Výsledek:

+-------------------+----------------------+--- ---------------------+----------------------+| USA se stoletím | USA bez století | Britové se stoletím | USA bez století ||-------------------+----------------------+-- ----------------------+----------------------|| 2030-03-02 | 2030-03-02 | 2030-02-03 | 2030-02-03 |+------------------+----------------------+ ------------------------+----------------------+ 

Řešení 2

Dalším způsobem, jak se s chybou vypořádat, je použít buď TRY_CAST() nebo TRY_CONVERT() . Tyto funkce vrátí NULL místo chyby.

Příklad:

SELECT TRY_CAST('Tomorrow' AS date); 

Výsledek:

NULL

To však nutně neřeší základní problém, pouze jej skrývá. Konverze stále nemohla proběhnout.

V každém případě to může být stále životaschopná možnost, v závislosti na vašich potřebách.

Řešení 3

Dalším způsobem, jak se s chybou vypořádat, je převod řetězce na jiný datový typ. Je zřejmé, že to není dobré, pokud chcete skončit s date typ, ale chyba možná vznikla proto, že jste omylem zadali date zadejte místo druhého typu.

Příklad:

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

Výsledek:

St

  1. Referenční alias (vypočítaný v SELECT) v klauzuli WHERE

  2. Standardní řetězce formátu data/času Podporovány FORMAT() na serveru SQL Server

  3. Při kaskádě mazání pro samoodkazovací tabulku

  4. PostgreSQL kontrolní omezení pro podmínku cizího klíče