我得到的部分任务涉及对几列执行计算,其中 2 列的格式为 hh.mi.ss,它们是 varchar。为了使计算工作,我需要将它们转换为时间十进制格式,其中 1:30 将是 1.5 。由于我目前使用的是 SQL Server 2005,因此我没有内置时间或数据类型,也无法获得升级版本(不是我的选择)。使用我所拥有的,我在网上搜索并尝试转换它,但结果不准确。例如,13.28 变为(大致)13.5,这很好,但是,秒数变为 100 而不是以 60 结束(因为我将其转换为浮点数)。
例如,使用 12.57.46,
CAST(DATEPART(HH, CAST(REPLACE([OASTIM], '.', ':') AS DATETIME)) AS FLOAT) +
(CAST(DATEPART(MI, CAST(REPLACE([OASTIM], '.', ':') AS DATETIME)) AS FLOAT)/60) +
(CAST(DATEPART(SS, CAST(REPLACE([OASTIM], '.', ':') AS DATETIME)) AS FLOAT)/3600)
给了我 12.962...
然而
CAST(SUBSTRING([OASTIM], 1, 2) AS FLOAT) +
((CAST(SUBSTRING([OASTIM], 4, 5) AS FLOAT) +
CAST(SUBSTRING([OASTIM], 7, 8) AS FLOAT)/60)/60)
给了我 12.970....
当我尝试更简单的东西时,
DATEPART(HOUR, CAST(REPLACE([OASTIM], '.', ':') AS DATETIME))+
(DATEPART(MINUTE, CAST(REPLACE([OASTIM], '.', ':') AS DATETIME))/60)
失败了,只给了我 12
这是我第一次接触 Windows SQL 和 T-SQL,我已经为此苦苦挣扎了几个小时。尽管听起来很可怕,但我现在对它的工作感到满意,即使这意味着牺牲性能。