【问题标题】:Convert an int to time (strange values)将 int 转换为时间(奇怪的值)
【发布时间】:2016-12-20 13:02:42
【问题描述】:

查看别人搭建的服务器,我注意到时间是以 int 格式存储的。通过插入一些数据,我已经能够做如下推论:

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

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

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

谢谢。

【问题讨论】:

  • 你真的需要至少两个数据点来计算出这样的东西。
  • 1/1/1900 这是MM/DD/YYYY 还是DD/MM/YYYY ??
  • 嗨,戈登 - 好点。 523767 对应于下午 12:34:30

标签: sql-server tsql time types int


【解决方案1】:

试试这个:

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

结果

0,285416666666667

您的荒谬值似乎是逗号后面的部分,意思是一天的一小部分。你可以说一整天的 28.54% 之后是 06:51

编辑

感谢 Martin Smith,我必须更正我的“DATETIME 是浮点数”。

DATETIME 实际上存储为两个 4 字节整数组合成一个 8 字节结构。第一个 int 被视为一天的计数,第二个是自午夜以来的 ticks 的计数器。你可能会读到this

另一种常见的表示形式(我认为这对 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

【讨论】:

  • RE:“日期时间实际上是一个浮点数。”日期时间不是浮点数,即使您可以将其转换为浮点数。它存储为两个整数。一个是自偏移日期以来的天数,一个是当天的刻度数。
  • @MartinSmith 感谢您的提示!我阅读了一些关于DATETIME 内部表示的文章并编辑了我的答案。
  • Plus1 伟大的洞察力!当我第一次看到这个问题时,我很惭愧地承认我的思考过程。我觉得奇怪的是,不能将 TIME 转换为浮点数以获得当天的百分比。
猜你喜欢
  • 2015-11-19
  • 1970-01-01
  • 2021-04-01
  • 2010-10-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-03
相关资源
最近更新 更多