Sql server 将整数转换为时间(奇怪值)

Sql server 将整数转换为时间(奇怪值),sql-server,tsql,time,types,int,Sql Server,Tsql,Time,Types,Int,通过查看其他人构建的服务器,我注意到时间是以int格式存储的。通过插入一些数据,我能够进行以下推断: 285571对应于上午6:51:00(正负两秒) 对于询问的人,日期以1900年1月1日起的天数存储在另一列中 问题是:时间转换的神奇公式是什么 谢谢。试试这个: DECLARE @t DATETIME='06:51:00'; SELECT CAST(@t AS FLOAT) 结果 0,285416666666667 你荒谬的价值似乎是逗号后的部分,意思是一天的分数。你可以说在一整天的28.

通过查看其他人构建的服务器,我注意到时间是以int格式存储的。通过插入一些数据,我能够进行以下推断:

285571对应于上午6:51:00(正负两秒)

对于询问的人,日期以1900年1月1日起的天数存储在另一列中

问题是:时间转换的神奇公式是什么

谢谢。

试试这个:

DECLARE @t DATETIME='06:51:00';
SELECT CAST(@t AS FLOAT)
结果

0,285416666666667
你荒谬的价值似乎是逗号后的部分,意思是一天的分数。你可以说在一整天的28.54%之后是06:51

编辑 谢谢马丁·史密斯,我必须纠正我的“日期时间是浮动的”

一个
DATETIME
存储为两个4字节的整数,实际上组合成一个8字节的结构。第一个int作为一天的计数,第二个int是从午夜开始的
滴答声计数器。你可以阅读

另一种常见的表示法(我认为这对VB(A)、Access和相关系统有效)是
datetime
as
float
。整数部分是一天的计数,分数是一天的分数。SQL Server隐式转换此值:

SELECT CAST(0.5 AS DATETIME)
结果是
1900-01-01 12:00:00.000

要获得你的时间(神奇公式),你必须这样做:

SELECT CAST(0.285571 AS DATETIME)
更新神奇的解决方案 您可能需要再添加一个
CAST(…作为时间)
(取决于您的SQL Server版本)

对于纯计算的爱好者来说

SELECT CAST(CAST(CAST(@t AS FLOAT)/CAST(POWER(10,CAST(LOG10(@t) AS INT)+1) AS FLOAT) AS DATETIME) AS TIME)
更新
在您的情况下,最好将日计数器和时间值与字符串级别的
组合,将此值转换为
float
,并将结果转换为
datetime

您确实需要至少两个数据点来计算类似的值。
1/1/1900
这是
MM/DD/yyyyy
还是
DD/MM/yyyyy
?您好,戈登-很好。523767对应于12:34:30pmRE:“一个日期时间实际上是一个浮点数。”一个日期时间不是一个浮点数,即使你可以将它转换成一个浮点数。它存储为两个整数。一个是自抵消日期起的天数,另一个是当天的刻度数。@MartinSmith感谢您的提示!我读了一些关于
DATETIME
的内部表示的文章,并编辑了我的答案。加上一个伟大的洞察力!当我第一次看到这个问题时,我羞于承认我的思考过程。我觉得奇怪的是,人们不能将时间转换成浮动来获得一天的百分比。
SELECT CAST(CAST(CAST(@t AS FLOAT)/CAST(POWER(10,CAST(LOG10(@t) AS INT)+1) AS FLOAT) AS DATETIME) AS TIME)