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

Oprava Msg 8116 „Datum datového typu argumentu je neplatné pro argument 1 funkce podřetězec“ v SQL Server

Pokud se vám zobrazuje chyba SQL Server Msg 8116 s textem, který zní Datum datového typu argumentu je neplatné pro argument 1 funkce podřetězec , je to proto, že do funkce předáváte nesprávný datový typ – v tomto případě SUBSTRING() funkce.

Stejnou chybu (Msg 8116) můžete vidět také v mnoha jiných kontextech – není omezena na SUBSTRING() funkce.

Příklad chyby

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

DECLARE @d date = '2020-03-04';
SELECT SUBSTRING(@d, 1, 4);

Výsledek:

Msg 8116, Level 16, State 1, Line 2
Argument data type date is invalid for argument 1 of substring function.

Zde jsem předal date zadejte jako první argument do SUBSTRING() , ale to není povoleno.

SUBSTRING() Funkce přijímá znakový, binární, textový, ntextový nebo obrázkový výraz jako svůj první argument. Pokud předáte argument, který není jedním z těchto akceptovaných typů, dojde k výše uvedené chybě.

Jak již bylo zmíněno, může se to stát i u jiných funkcí. V každém případě to znamená, že funkci předáváte nesprávný datový typ.

Řešení 1

Za prvé, pokud procházíte kolonou, zkontrolujte, zda máte správný sloupec. Řešením může být jednoduchá záležitost nahrazení nesprávného názvu sloupce správným názvem sloupce.

Totéž, pokud předáváte proměnnou – zkontrolujte, zda se jedná o správnou proměnnou. Tento problém můžete vyřešit nahrazením nesprávné proměnné správnou.

Řešení 2

Pokud jste si jisti, že máte správný název sloupce/proměnnou, jedním ze způsobů, jak tuto chybu opravit, je převést argument na příslušný datový typ.

Výše uvedený příklad bychom mohli upravit například na následující:

DECLARE @d date = '2020-03-04';
SELECT SUBSTRING(CAST(@d AS varchar(10)), 1, 4);

Výsledek:

2020

Řešení 3

Ale než něco převedeme, někdy se vyplatí ustoupit a přemýšlet, jestli neexistuje jednodušší způsob, jak dosáhnout požadovaného výsledku.

Například ve výše uvedeném příkladu se vše, co se snažíme udělat, je extrahovat rok z data. V tomto případě by bylo lepší odstranit SUBSTRING() funkce jako celek ve prospěch YEAR() funkce:

DECLARE @d date = '2020-03-04';
SELECT YEAR(@d);

Výsledek:

2020

Dalším způsobem, jak to udělat, by bylo použít FORMAT() funkce:

DECLARE @d date = '2020-03-04';
SELECT FORMAT(@d, 'yyyy');

Výsledek:

2020

  1. Přístupy ke shardování MySQL?

  2. Jak rozdělit postgresovou tabulku pomocí mezilehlé tabulky

  3. Jak zálohovat databázi Moodle MySQL

  4. 2 Funkce pro získání roku z data v Oracle