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

4

浏览别人构建的服务器时,我注意到时间以int格式存储。通过插入一些数据,我已经能够进行以下推断:

285571 对应于上午6:51:00(误差在两秒左右)

对于那些询问的人,日期在另一列中以自1900年1月1日以来的天数存储。

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

谢谢。


4
你真的至少需要两个数据点来弄清楚这样的事情。 - Gordon Linoff
"1/1/1900" 是 "MM/DD/YYYY" 还是 "DD/MM/YYYY"? - M.Ali
嗨,戈登 - 说得好。523767对应于下午12:34:30。 - taylorswiftfan
1个回答

6

试试这个:

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

结果

0,285416666666667

你可笑的值似乎是逗号后面的部分,意味着一天的分数。你可以说在28.54%的完整一天之后是06:51

编辑

感谢Martin Smith,我需要更正我的“DATETIME是FLOAT”的说法。
实际上,DATETIME被存储为两个4字节整数组合成的8字节结构。第一个整数被视为一天的计数,第二个整数是自午夜以来ticks的计数器。你可以阅读这篇文章
另一种常见的表示方法(我认为这对VB(A),Access和相关系统有效)是一个datetime作为float. 整数部分是一天的计数,小数部分是一天的分数。 SQL Server会隐式地将其转换:
SELECT CAST(0.5 AS DATETIME)

结果为1900-01-01 12:00:00.000 要获得您的时间(即魔法公式),请按照以下步骤进行:
SELECT CAST(0.285571 AS DATETIME)

更新神奇解决方案

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

你可能需要添加一个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)

更新

在你的情况下,最好将你的日计数器和时间值用字符串级别的.结合起来,将其转换为float,然后将结果转换为datetime


回复:“DATETIME实际上是一个FLOAT。” DATETIME并不是一个FLOAT,即使你可以将其转换为FLOAT。它存储为两个整数。一个是自偏移日期以来的天数,另一个是一天中的滴答数。 - Martin Smith
1
@MartinSmith 非常感谢您的提示!我阅读了一些有关“DATETIME”内部表示的文章并编辑了我的答案。 - Shnugo
加1 很有见地!我很惭愧地承认,当我第一次看到这个问题时,我的思维过程是错误的。我觉得奇怪的是,为什么不能将时间转换为浮点数来获取一天的百分比。 - John Cappelletti

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