在SQL Server中用什么数据类型来存储日期值?

3

我正在调查一个我刚刚接手的数据库的性能问题。我可以看到由于查询将货币数据类型转换为日期,出现了很多隐式转换。看起来几乎所有的日期字段都有货币数据类型。

有人能告诉我为什么有人会使用货币数据类型来表示日期吗?这是个好的且有效的理由吗?

谢谢!


3
没有好的和有效的理由,只有坏的和无效的理由。 - Oded
2个回答

6

这种做法没有任何好的或合理的原因。

datetimemoney都是8个字节。其中datetime有4个字节用于date,另外4个字节用于time

money的范围从-922,337,203,685,477.5808922,337,203,685,477.5807。当从money转换为datetime时,整数部分被视为自1900-01-01以来的天数,而小数部分则表示一天的百分比。

这意味着您会失去time部分的精度(每个0.0001增量= 8.640秒),并且通过能够存储数字远远超过datetime的最大边界(9999 AD)而获得无用的额外比例在date部分中。

如果可能,请修复模式。


感谢您快速的回复。这证实了我的怀疑。我想对于一个老系统来说,修复这个问题并不容易。 - pesi

0

我认为这只是为了节省空间和实现次分钟粒度,但设计显然很奇怪。

可能是为了避免DATETIME和SMALLDATETIME的限制,但如果你说它经常转换成日期 - 这不太可能。

更新:

正如@Martin Smith所说 - 它并没有节省空间 - 那么设计就更加奇怪了。

还有一个建议 - 数据是从旧的遗留DB系统导入的,其中datetime值是以这种方式存储的。

显然 - 如果你寻找一个好的和有效的理由 - 那就没有了。


3
不会节省任何空间。datetimemoney都是8个字节。 - Martin Smith

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接