2013-08-24 21 views
5

Podczas wykonywania jest następujący błąd pokazującBłąd przepełnienia arytmetycznego konwertujący wyrażenie na datetime typu danych. (Podczas wyświetlania czasu, daty ..)

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

błąd pokazuje

Arithmetic overflow error converting expression to data type datetime. 
+0

Zwykle widziałem przekonwertowania wyrażeń takich jak traktujących * ciągi * zamiast liczb. Czy musisz zacząć od typu numerycznego? –

+0

ya @jon Skeet ... – Nisar

Odpowiedz

9

Państwo problem jest to, że starasz się convert numerycznej do datetime, a to po prostu nie działa.

Musisz włączyć numeric na sznurku pierwszy:

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.

Podczas próby przekonwertowania typu liczbowego na datetime, SQL Server próbuje dodać wartość liczbową jako liczbę dni do daty 01-Jan-1900. W twoim przypadku próbuje dodać miliony dni, a tym samym błąd przepełnienia.

CONVERT działa dobrze, też, jeśli wolisz:

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

SQL Fiddle with demo.

3

Widziałem tylko konwersję używany strun. Nie mogę łatwo stwierdzić, czy jest on przeznaczony do pracy z liczbami. Możesz może przekształcić liczbę na ciąg znaków, a następnie ciąg na datę. Jednak ja osobiście wystarczy użyć DATEFROMPARTS:

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

Jest to dobre podejście, ale warto zauważyć, że to tylko SQL Server 2012 i wyżej. –

+1

@IanPreston: Nie zauważyłem tego. * Na pewno * istnieje sposób na stworzenie daty z jej części składowych przed tym bez użycia ciągu ... –

2

Dlaczego numeryczne? Spróbuj tego

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

Zgodnie z komentarzami z OP musi on zacząć od typu "numerycznego". –

+0

@Ian Preston, , ale widzę, że jest 22 sierpnia 2013 r., Nie jest liczbą całkowitą. :-) – msi77

Powiązane problemy