【发布时间】:2018-04-28 23:44:10
【问题描述】:
我正在使用 MsSQL Server 玩了几天,在将日期时间转换为/从小数时偶然发现了一个奇怪的行为。
SELECT [date] = GETDATE()
, [as decimal] = CAST(GETDATE() AS decimal)
, [from decimal] = CAST(CAST(GETDATE() AS decimal) AS datetime)
, [as float] = CAST(GETDATE() AS float)
, [from float] = CAST(CAST(GETDATE() AS float) AS datetime)
-- should be: 2009-08-15
, [from stored float] = CAST(CAST('40039.9583333333' AS float) AS datetime)
当我在不添加任何特定内容的情况下转换日期时间时,小数点将按照我定义的小数点 (18, 0) 进行处理。 So there is a data loss in some way.
如果我直接将浮点数转换回从日期时间转换的日期时间(如我的查询的第 7 行所示),一切都很好。
但是当我从数据库表中加载一个值时,例如 40039.9583333333,它肯定是根据用户输入 (2009-08-15) 计算出来的,并将其转换回日期时间,它会增加一天。
我找不到任何关于这次损失的具体信息。
有人能够描述这种奇怪行为背后的问题吗? 如果可能的话: 添加一个如何正确进行这些转换的示例?
谢谢。
【问题讨论】:
-
您的代码运行良好。当我将 40039.9583333333 转换为日期时间时,它确实给了我 2009-08-16。你是从哪里得到这个值的?
-
由于 0.0 将是 '19000101 00:00:00',我会确保您从该数据库加载的值处于相同的比例。基本上,你确定 40039.9583333333 是 '2009-08-15'?
-
我不能 100% 确定,因为数据来自我不知道源代码的程序。但是
15.08.2009(德语格式)是用户插入的,从中计算出的数字是40039.9583333333 -
在SQL中
40039.9583333333是SELECT CAST(CAST('2009-08-16 23:00' AS DATETIME) AS FLOAT)的结果
标签: sql tsql datetime type-conversion sql-server-2014