2013-09-24 77 views
2

我从SQL数据库中提取数据。我有几列需要转换为Int类型的日期,但是当我这样做时日期会改变(-2天)。我尝试了Cast和Convert,它总是一样的。 转换为其他类型的工作正常,并返回正确的日期,但不适合我。我只需要datetime中的日期部分,并且需要通过Excel将其识别为日期。Excel错误地将Date转换为Int

这是怎么发生的?任何想法如何让它分类?

我使用下面的查询:

SELECT wotype3, CONVERT(INT,wo_date2 ,103), CAST(duedate AS int) FROM Tasks WHERE 
duedate > DATEADD(DAY,1, GETDATE()) 
AND wo_date2>0 
AND wo_date2<DATEADD(WEEK,3,GETDATE()) 
ORDER BY wotype3 
+0

看看'“CONVERT(日期,DATEADD(日,wo_date2/1440,start_date_in_your_database))' – 2013-09-24 12:19:13

+0

你是如何将数据导出到Excel文件 – Pratik

+0

PRATIK:我使用的是SQL数据选项卡中的服务器连接 – GRegorious13

回答

1

对于SQL Server 2008及以上版本,您可以使用日期数据类型。

declare @dt datetime = '12/24/2013 10:45 PM' -- some date for example 
SELECT @dt as OriginalDateTime, CAST(@dt as DATE) as OnlyDate 

对于SQL Server 2008之前的版本,您需要使用一个或其他函数截断时间部分。这里是做的一个方法:

declare @dt datetime = '12/24/2013 10:45 PM' -- some date for example 
SELECT @dt as OriginalDateTime, CAST(FLOOR(CAST(@dt AS FLOAT)) as DATETIME) as OnlyDate 
+0

Trunctating就是答案!在Excel 2010中,日期时间字段被视为数字,但日期 - 不是,这就是为什么我不能使用它。值不正确。 – GRegorious13

2

我已经受够了这个大问题,检查我的SQL Server的计算结果与该用户使用了Excel中创建“预期的效果”。

由于这两天的日期差异,我们有差异。

为什么发生?

两个原因:

  1. SQL Server使用从1900年1月1日从零开始日起计,但Excel使用一个基于1日起计1月1 1900年

  2. Excel中有一个错误(喘气!),这使得它认为1900年是一个闰年。事实并非如此。 SQL Server正确拒绝让您拥有包含“29-Feb-1900”的日期值。

enter image description here

结合这两种差异,这就是为什么所有的日期,从1900年3月1日起,总是2天了。

显然,这个Excel错误是一个已知问题,为了保持它与Lotus 1-2-3一致。

The Intentional Date Bug

Microsoft's own explanation

从现在开始,我想我会在我的代码用同样的借口辩解的错误。

;-)

+1

很好的解释,谢谢,现在我可以安全地减去2 :) – aorcsik