我有一个约会数据集,包含每个约会的开始和结束时间。我需要计算约会持续的时间(以小时为单位),但这两个字段是24小时制,格式为INTEGER
。更糟糕的是,它们被格式化为3个和4个字符的整数,例如830
和1630
,而不是0830
和1630
。
使用这两列之间的小时数创建列的最佳方法是什么?我已经尝试将它们转换为CHAR
然后获取最后两个的子串,但是我不能让它在3和4个时间长度上工作。
目前看起来像这样:
╔═══════════╦═════════╗
║ startTime ║ endTime ║
╠═══════════╬═════════╣
║ 830 ║ 1600 ║
║ 400 ║ 800 ║
║ 1350 ║ 1400 ║
╚═══════════╩═════════╝
我希望看起来像这样:
╔═══════════╦═════════╦═══════╗
║ startTime ║ endTime ║ Hours ║
╠═══════════╬═════════╬═══════╣
║ 830 ║ 1600 ║ 7.5 ║
║ 400 ║ 800 ║ 4 ║
║ 1350 ║ 1400 ║ .5 ║
╚═══════════╩═════════╩═══════╝
答案 0 :(得分:6)
由于startTime
和endTime
都是整数,因此您可以使用简单的模数和除法来分隔分钟和小时。
以下表达式将在几分钟内为您提供startTime
:
startTime % 100 + (startTime / 100) * 60
您可以对endTime
执行相同的操作,并从endTime
中减去startTime
,以获得时间差的表达式,以分钟为单位:
(endTime % 100 + (endTime / 100) * 60) - (startTime % 100 + (startTime / 100) * 60)
最后,将其转换为小时:
((endTime % 100 + (endTime / 100) * 60) - (startTime % 100 + (startTime / 100) * 60)) / 60.0
注意除以60.0
(浮点数)而不是60
(这是一个整数),这样最终结果将是浮点而不是整数。
您的最终SQL查询应如下所示:
SELECT
startTime,
endTime,
(((endTime % 100 + (endTime / 100) * 60) - (startTime % 100 + (startTime / 100) * 60)) / 60.0)
AS diff
FROM appointments
答案 1 :(得分:0)
使用辅助函数将INT军事时间转换为SQL数据库的本机DATETIME类型:
SELECT DATEDIFF(hh, dbo.fnConvertMilitary(StartTime),
dbo.fnConvertMilitary(EndTime)
FROM appointments
请参阅@ AlonGubkin关于dbo.fnConvertMilitary实施的最佳答案。
答案 2 :(得分:0)
SELECT CASE LEN(D)
WHEN 3 THEN <do your 3 digit logic here>
ELSE <do your 4 digit logic here>
END CASE
答案 3 :(得分:0)
您需要在 100 的除法上使用 CAST
来去除小数
(((`time_to` % 100 + CAST((`time_to` / 100) AS INT) * 60) - (`time_from` % 100 + CAST((`time_from` / 100) AS INT) * 60)) / 60.0) AS diff
示例:
时间结束:2200
时间开始:2030
如果你不使用 CAST