【发布时间】:2020-12-04 22:16:53
【问题描述】:
我正在尝试将字符串中的时间转换为小时数。
例如
| Hours in text | Number of hours |
| ------------------- | --------------- |
| 1 minute | 0.02 |
| 30 minutes | 0.5 |
| 2 Hours 15 Minutes | 2.25 |
| 8 Hours | 8 |
| 4 Hours 30 Minutes | 4.5 |
| 1 Hour | 1 |
DECLARE @tabvar TABLE(TimeInText VARCHAR(100));
INSERT INTO @tabvar(TimeInText)
SELECT '1 minute' UNION ALL
SELECT '30 minutes' UNION ALL
SELECT '2 Hours 15 Minutes' UNION ALL
SELECT '8 Hours' UNION ALL
SELECT '4 Hours 30 Minutes' UNION ALL
SELECT '1 Hour'
SELECT CONVERT(CHAR(5), DATEADD(MINUTE, 60 * NULLIF(RTRIM(LTRIM(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(TimeInText, ' Hours ', '.'), ' Hours', '.'), ' Hour', '.00'), ' Minutes', ''), ' ', ''))), ''), 0), 108)
FROM @tabvar
在尝试转换 8 小时时,我被“8”卡住了。而不是“8”
【问题讨论】:
-
1 分钟不是
0.01小时,而是0.016666~;我希望您将其四舍五入到0.02或(可能更好)显示更多小数点。然而,真正的问题是,为什么要将时间段存储为varchar,而当有time数据类型时,则存储为描述性文本? -
嗨@Larnu,1 分钟是 0.16666。嗯,这是来自遗留应用程序的数据,正在尝试清理混乱。
-
这并不能解释为什么当
0.02更接近时,您将'1 minute'转换为0.01。 -
你能为字符串定义一个精确的语法和语义吗?是否允许
'2 Hour'(当单词应该是复数时)?'65 minutes'(超过一小时的分钟数)?'Days'?'Seconds'?几小时前的几分钟?'Quarter hour'? ...在不知道规则的情况下,很难解析字符串。 -
嗨@Larnu,1分钟是0.02。我会相应地更新原帖。
标签: sql-server tsql sql-server-2016