找出SQL中两个24小时之间的小时差异

时间:2013-12-27 19:30:12

标签: sql

我有一个约会数据集,包含每个约会的开始和结束时间。我需要计算约会持续的时间(以小时为单位),但这两个字段是24小时制,格式为INTEGER。更糟糕的是,它们被格式化为3个和4个字符的整数,例如8301630,而不是08301630

使用这两列之间的小时数创建列的最佳方法是什么?我已经尝试将它们转换为CHAR然后获取最后两个的子串,但是我不能让它在3和4个时间长度上工作。

目前看起来像这样:

╔═══════════╦═════════╗
║ startTime ║ endTime ║
╠═══════════╬═════════╣
║       830 ║    1600 ║
║       400 ║     800 ║
║      1350 ║    1400 ║
╚═══════════╩═════════╝

我希望看起来像这样:

╔═══════════╦═════════╦═══════╗
║ startTime ║ endTime ║ Hours ║
╠═══════════╬═════════╬═══════╣
║       830 ║    1600 ║ 7.5   ║
║       400 ║     800 ║ 4     ║
║      1350 ║    1400 ║ .5    ║
╚═══════════╩═════════╩═══════╝

4 个答案:

答案 0 :(得分:6)

由于startTimeendTime都是整数,因此您可以使用简单的模数和除法来分隔分钟和小时。

以下表达式将在几分钟内为您提供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

会导致 1.2~