2014-10-16 58 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

相关问题