web-dev-qa-db-fra.com

Erreur de dépassement arithmétique lors de la conversion de l'expression en type de données datetime. (tout en affichant l'heure de la date ..)

Lors de l'exécution, l'erreur suivante s'affiche

declare @yr_mnth_dt as numeric;
set @yr_mnth_dt = 20130822;
select convert(datetime,@yr_mnth_dt,112) as YR_MNTH_DT

erreur montre

Arithmetic overflow error converting expression to data type datetime.
9
Nisar

Votre problème est que vous essayez de convert le numérique vers un datetime, et cela ne fonctionne tout simplement pas.

Vous devez d'abord transformer votre numeric en une chaîne:

declare @yr_mnth_dt as numeric;
set @yr_mnth_dt = 20130822;

select yr_mnth_dt = cast(cast(@yr_mnth_dt as char(8)) as datetime);

SQL Fiddle avec démo .

Lorsque vous essayez de convertir un type numérique en datetime, SQL Server essaie d'ajouter la valeur numérique comme le nombre de jours à la date 01-Jan-1900. Dans votre cas, cela tente d'ajouter des millions de jours, et donc l'erreur de débordement.

CONVERT fonctionne aussi très bien, si vous préférez:

select yr_mnth_dt = convert(datetime, convert(char(8), @yr_mnth_dt));

SQL Fiddle avec démo .

13
Ian Preston

Je n'ai vu que la conversion utilisée pour les chaînes. Je ne peux pas facilement dire s'il est même conçu pour fonctionner avec des chiffres. Vous pourriez convertir le nombre en une chaîne, puis la chaîne en une date. Cependant, j'utiliserais personnellement DATEFROMPARTS :

SELECT DATEFROMPARTS(@yr_mnth_dt / 10000, 
                     (@yr_mnth_dt / 100) % 100,
                     @yr_mnth_dt % 100) AS YR_MNTH_DT
3
Jon Skeet

Pourquoi numérique? Essaye ça

declare @yr_mnth_dt as varchar(10);
set @yr_mnth_dt = '20130822';
select convert(datetime,@yr_mnth_dt,112) as YR_MNTH_DT
2
msi77