tay*_*fan 4 t-sql sql-server int time types
通过其他人构建的服务器查看,我注意到时间以int格式存储.通过插入一些数据,我可以进行以下扣除:
285571对应于上午6:51:00(加减去2秒)
对于那些要求的人,日期存储在自19/1年1月1日以来的另一列中.
问题是:用于时间转换的神奇公式是什么?
谢谢.
试试这个:
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),访问和相关系统)是一个datetime为float.整数部分是日期计数,分数是日期的分数.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)
在您的情况下,最好将您的日期计数器和您的时间值与.字符串级别相结合,将其转换float为结果datetime.