2014-10-16 61 views
-2

我有一個表格,它以nvarchar格式存儲日期信息(dd/mm/yyyy),當我使用Convert(nvarchar(100),dt,101)將此列轉換爲datetime時沒有任何問題,但是,當我要選擇頂部x行從什麼樣子,我得到了以下錯誤:算術溢出錯誤轉換datetime的

Msg 8115, Level 16, State 2,Arithmetic overflow error converting expression to data type datetime.

以下是我的代碼示例:

declare @d as nvarchar(100); 
SET @d='20/11/2012' 

SELECT 
    top 1 @d, 
    (select date_diff = DATEDIFF(
     day, 
     CAST(Convert(nvarchar(100), @d, 101) as DateTime), 
     '2014-10-01 00:00:00')) d 
+0

「我得到一個錯誤」不是一個問題描述(事實上,「錯誤」甚至不是一個字)。你得到了什麼**特定的錯誤**?問題應該是具體的,而且你有錯誤信息在你面前 - 爲什麼你不把它包括在你的問題中,所以我們也有它? (請記住,以備將來的問題。) – 2014-10-16 23:58:31

回答

2

這是隻是SQL將第一個日期時間解釋爲2012年第20個月的第11天。

嘗試使用SQL的其中一個preferred日期格式。

我的首選格式爲dd-MMM-yyyy,因爲它是絕不含糊:

declare @d as nvarchar(100); 
SET @d='20-Nov-2012' 


SELECT 
    top 1 @d, 
    (select date_diff = DATEDIFF(
     day, 
     CAST(Convert(nvarchar(100), @d, 101) as DateTime), 
     '01-OCt-2014 00:00:00')) d 

SQL挑選基於語言的date format

也可以是明確的,告訴它使用dmy格式在查詢像這樣:基於下面我推斷這種查詢的意見

SET DATEFORMAT 'dmy' 

--Pretending to be some table in the database with varchar dates :(
create table #test (dt varchar(100)) 
insert #test values ('20/11/2012') 


SET DATEFORMAT 'dmy' --Works 
--SET DATEFORMAT 'mdy' --Doesn't Work 

SELECT 
    top 1 dt, 
    (select date_diff = DATEDIFF(
     day, 
     CAST(Convert(nvarchar(100), dt, 101) as DateTime), 
     '2014-10-01 00:00:00')) d 
from #test 

drop table #test 

但在這種情況下,我們從表中選擇一個varchar日期,設置日期格式正確的問題。嘗試使用不同的dateformat s進行測試。

+0

我的問題是數據庫中的數據以'20/11/2012'格式存儲。 – NR65 2014-10-17 00:22:37

+0

所以'@ d'是從另一個查詢/表中選擇的值?附:這就是爲什麼你不應該將日期存儲爲varchar的;) – DaveShaw 2014-10-17 00:23:43

+0

@ NR65 - 更新我的答案 – DaveShaw 2014-10-17 00:27:25

相關問題