将int转换为时间(奇怪的值)

tay*_*fan 4 t-sql sql-server int time types

通过其他人构建的服务器查看,我注意到时间以int格式存储.通过插入一些数据,我可以进行以下扣除:

285571对应于上午6:51:00(加减去2秒)

对于那些要求的人,日期存储在自19/1年1月1日以来的另一列中.

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

谢谢.

Shn*_*ugo 6

试试这个:

DECLARE @t DATETIME='06:51:00';
SELECT CAST(@t AS FLOAT)
Run Code Online (Sandbox Code Playgroud)

结果

0,285416666666667
Run Code Online (Sandbox Code Playgroud)

你的荒谬价值似乎是逗号之后的部分,意思是一天中的一小部分.你可以说在一整天的28.54%之后它是06:51

编辑

对马丁史密斯来说,我必须纠正我的"DATETIME是一个浮动".

A DATETIME实际上存储为两个4字节整数组合成一个8字节结构.第一个int作为一天的计数,第二个是ticks从午夜开始的计数器.你可能会读到这个.

另一种常见的表示(我认为这是有效的VB(A),访问和相关系统)是一个datetimefloat.整数部分是日期计数,分数是日期的分数.SQL Server隐式转换它:

SELECT CAST(0.5 AS DATETIME)
Run Code Online (Sandbox Code Playgroud)

结果是 1900-01-01 12:00:00.000

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

SELECT CAST(0.285571 AS DATETIME)
Run Code Online (Sandbox Code Playgroud)

更新神奇的解决方案

DECLARE @t INT=285571;
SELECT CAST(CAST('0.' + CAST(@t AS VARCHAR(100)) AS FLOAT) AS DATETIME)
Run Code Online (Sandbox Code Playgroud)

您可能想要再添加一个CAST( ... AS TIME)(取决于您的SQL Server版本)

而对于纯粹计算的粉丝

SELECT CAST(CAST(CAST(@t AS FLOAT)/CAST(POWER(10,CAST(LOG10(@t) AS INT)+1) AS FLOAT) AS DATETIME) AS TIME)
Run Code Online (Sandbox Code Playgroud)

UPDATE

在您的情况下,最好将您的日期计数器和您的时间值与.字符串级别相结合,将其转换float为结果datetime.