我从SQL数据库中提取数据。我有几个日期需要转换为Int类型的列,但是当我这样做时,日期会发生变化(-2天)。我尝试过Cast和Convert,它总是一样的。 转换为其他类型工作正常并返回正确的日期,但不适合我。我只需要datetime中的日期部分,需要通过Excel将其识别为日期。
为什么会这样?任何想法如何排序?
我正在使用以下查询:
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 :(得分:3)
我遇到了很大的问题,检查我的SQL Server的计算结果是否是用户使用Excel创建的“预期结果”。
我们因为这2天的日期差异而存在差异。
为什么会这样?
有两个原因:
从1900年1月1日开始,SQL Server使用从零开始的日期计数,但Excel使用从1900年1月1日开始的基于1的日期计数。
Excel中有一个错误(喘息!),这让它认为1900年是闰年。事实并非如此。 SQL Server正确拒绝让您拥有包含“29-Feb-1900
”的日期值。
结合这两个差异,这就是为什么所有日期,从1900年3月1日开始,总是2天。
显然,这个Excel错误是一个已知的问题,以使其与Lotus 1-2-3保持一致。
从现在开始,我认为我会以相同的理由证明我的代码中的错误。
- )
答案 1 :(得分:1)
对于SQL Server 2008及更高版本,您可以使用DATE数据类型。
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