2011-05-13 56 views
2

由于种种原因,我将日期时间值作为sql float类型(从DateTime.OADate转换而来)存储在数据库中,但是在某些情况下,从数据库中获取可读的日期/时间列是很好的。我发现,我可以执行该语句将日期时间类型的双精度投入时间为2天?

SELECT CAST (timerecorded_utc as DATETIME) FROM tablename 

,它会给我,我要找的日期时间字符串,但它似乎正好2天关闭。我知道我可以只修改语句(因为在表示为双人床1天= 1.0倍)是

SELECT CAST (timerecorded_utc-2.0 as DATETIME) FROM tablename 

但我想知道这是否是一致的,在我看来,有一些理由的差异我错过了。

+0

将数据保存到数据库时可能会丢失一些精度吗? – 2011-05-13 16:57:34

+0

我不认为它是精密相关的,因为时间降到毫秒是正确的。日期在小数点之前计算,时间来自小数点后的值。如果它与精度有关,那么时间会是错误的(至少我认为) – 2011-05-13 16:59:44

+0

@Mthethe,日期到浮点转换是什么样的? – 2011-05-13 17:04:12

回答

6

这是因为日期使用的时代不同。

SQL Server的DATETIME使用01/01/1900 00:00:00的时代,你可以通过运行下面的查询,请参阅:SELECT CAST(0 AS DATETIME)

OADate有点奇怪,因为它可能具有的时代30/12/1899 00:00:00或31/12/1899 00:00:00取决于你是否相信Visual Basic或Excel家伙。看起来,从你的两天差异来看,.NET版本与30日一样。

因此,当您通过原始数字在两种类型的日期之间进行转换时,由两天产生的时间会给出两天的结果差异。

+0

任何人都知道是否有任何方法来这个疯狂? – 2011-05-13 17:13:31

+0

真棒为什么我没有想到这个...如果我运行DateTime.FromOADate(0.0)我得到12/30/1899 12:00:00 AM谢谢!!!! – 2011-05-13 17:16:50

+0

Excel也有一个“功能”—有意从莲花1-2-3! —其中闰年规则规则未正确实施。正确的闰年规则是闰年是那些可以被4整除的年份,除100之外也不能被整除,除非可以被400整除(例如2004年是闰年,2000年是闰年,但1900年不是闰年) 。 Lotus 1-2-3和Excel错误地认为所有可以被4整除的年份都是闰年。有关更多详细信息,请参阅http://support.microsoft.com/kb/214326。 – 2011-05-13 17:27:05