2013-08-24 239 views
5

Trong khi thực hiện lỗi sau đang hiển thịLỗi tràn số học chuyển đổi biểu thức thành datetime kiểu dữ liệu. (Khi hiển thị thời gian ngày ..)

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

lỗi cho thấy

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

Tôi thường thấy các biểu thức chuyển đổi giống như cách xử lý * xâu * chứ không phải là số. Bạn có phải bắt đầu với một kiểu số không? –

+0

ya @jon Skeet ... – Nisar

Trả lời

9

Bạn vấn đề là bạn đang cố gắng để convert các số để một datetime, và điều này chỉ là không làm việc.

Bạn cần phải bật numeric của bạn thành một chuỗi đầu tiên:

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.

Khi bạn thử và chuyển đổi loại số thành datetime, SQL Server cố gắng thêm giá trị số làm số ngày vào ngày 01-Jan-1900. Trong trường hợp của bạn, điều này đang cố gắng thêm hàng triệu ngày và do đó lỗi tràn.

CONVERT hoạt động tốt, cũng vậy, nếu bạn thích:

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

SQL Fiddle with demo.

3

Tôi đã chỉ nhìn thấy việc chuyển đổi sử dụng cho các chuỗi. Tôi không thể dễ dàng biết liệu nó có được thiết kế để làm việc với các con số hay không. Bạn có thể chuyển đổi số thành chuỗi, sau đó chuỗi thành một ngày. Tuy nhiên, cá nhân tôi sẽ chỉ cần sử dụng DATEFROMPARTS:

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

Đây là một cách tiếp cận tốt, nhưng đáng chú ý đó là SQL Server 2012 trở lên mà thôi. –

+1

@IanPreston: Đã không nhận thấy điều đó. * Chắc chắn * có một số cách để tạo ra một ngày từ các bộ phận cấu thành của nó trước đó mà không cần sử dụng một chuỗi ... –

2

Tại sao phải là số? Hãy thử điều này

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

Theo các ý kiến ​​từ OP, anh ta phải bắt đầu với một kiểu 'số'. –

+0

@Ian Preston, nhưng tôi thấy rằng đó là ngày 22 tháng 8 năm 2013, không phải là số nguyên. :-) – msi77