Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Arithmetic overflow error converting expression to data type datetime. (while displaying date time..)

While executing following error is showing

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

error shows

Arithmetic overflow error converting expression to data type datetime.
like image 250
Nisar Avatar asked Aug 24 '13 08:08

Nisar


People also ask

How do you fix an arithmetic overflow error?

The solution to avoid this arithmetic overflow error is to change the data type from INT to BIGINT or DECIMAL(11,0) for example.

How do you fix the conversion of a varchar data type to a datetime data type resulted in an out of range value?

The conversion of a varchar data type to a datetime data type resulted in an out-of-range value. You need separators for the date like a “/”, a “.” or a “-“. We use substring to concatenate the “-” to use an acceptable date format and then we use the CONVERT function to convert the characters to sql date.


3 Answers

You issue is that you're trying to convert the numeric to a datetime, and this just isn't working.

You need to turn your numeric into a string first:

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 with demo.

When you try and convert a numeric type to a datetime, SQL Server tries to add the numeric value as the number of days to the date 01-Jan-1900. In your case this is trying to add millions of days, and hence the overflow error.

CONVERT works fine, too, if you prefer:

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

SQL Fiddle with demo.

like image 152
Ian Preston Avatar answered Oct 21 '22 13:10

Ian Preston


I've only seen the conversion used for strings. I can't easily tell whether it's even designed to work with numbers. You could convert the number to a string, then the string to a date. However, I would personally just use DATEFROMPARTS:

SELECT DATEFROMPARTS(@yr_mnth_dt / 10000, 
                     (@yr_mnth_dt / 100) % 100,
                     @yr_mnth_dt % 100) AS YR_MNTH_DT
like image 23
Jon Skeet Avatar answered Oct 21 '22 13:10

Jon Skeet


Why numeric? Try this

declare @yr_mnth_dt as varchar(10);
set @yr_mnth_dt = '20130822';
select convert(datetime,@yr_mnth_dt,112) as YR_MNTH_DT
like image 38
msi77 Avatar answered Oct 21 '22 13:10

msi77