3

我正在从 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
4

2 回答 2

3

我遇到了很大的问题,用用户使用 Excel 创建的“预期结果”检查我的 SQL Server 的计算结果。

仅仅因为这 2 天的日期差异,我们就有了差异。

为什么会这样?

两个原因:

  1. SQL Server 从 1900 年 1 月 1 日开始使用从零开始的日期计数,但 Excel 从 1900 年 1 月 1 日开始使用从 1 开始的日期计数。

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

在此处输入图像描述

将这两个差异结合起来,这就是为什么从 1900 年 3 月 1 日起的所有日期总是在 2 天之后。

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

故意日期错误

微软自己的解释

从现在开始,我想我会用同样的借口来证明我的代码中的错误是正确的。

;-)

于 2014-08-13T12:50:37.900 回答
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
于 2013-09-24T12:27:13.347 回答