如何用SQL计算Intime与Outtime两个时间的时长差?
如何用SQL计算Intime与Outtime的时长
你的数据表结构如下:
| ID | Name | Class | Date | Intime | Outtime | Hours |
|---|---|---|---|---|---|---|
| 1001 | Paul | 1st | 09-12-2022 | 8:30 AM | 4:30 PM | 8 |
下面针对不同主流数据库,给出计算Intime与Outtime之间时长(即Hours列的取值逻辑)的实现方法:
MySQL 实现方式
先将Date、Intime/Outtime拼接为完整的日期时间字符串,转成datetime类型后,用TIMESTAMPDIFF计算小时差:
SELECT ID, Name, Class, Date, Intime, Outtime, TIMESTAMPDIFF(HOUR, STR_TO_DATE(CONCAT(Date, ' ', Intime), '%m-%d-%Y %h:%i %p'), STR_TO_DATE(CONCAT(Date, ' ', Outtime), '%m-%d-%Y %h:%i %p')) AS Hours FROM Table1;
STR_TO_DATE:将字符串按指定格式(%m-%d-%Y对应月-日-年,%h:%i %p对应12小时制带AM/PM的时间)转换为datetime类型TIMESTAMPDIFF:直接返回两个时间的小时差值
SQL Server 实现方式
通过CAST将拼接后的日期时间字符串转为datetime2类型,再用DATEDIFF计算小时差:
SELECT ID, Name, Class, Date, Intime, Outtime, DATEDIFF(HOUR, CAST(CONCAT(Date, ' ', Intime) AS DATETIME2), CAST(CONCAT(Date, ' ', Outtime) AS DATETIME2)) AS Hours FROM Table1;
- SQL Server的
CAST可以直接识别带AM/PM的12小时制时间格式 DATEDIFF:指定计算单位为HOUR,返回两个时间的小时差
PostgreSQL 实现方式
用TO_TIMESTAMP将拼接字符串转为时间戳,相减得到时间间隔后提取小时数:
SELECT ID, Name, Class, Date, Intime, Outtime, EXTRACT(HOUR FROM ( TO_TIMESTAMP(CONCAT(Date, ' ', Outtime), 'MM-DD-YYYY HH:MI AM') - TO_TIMESTAMP(CONCAT(Date, ' ', Intime), 'MM-DD-YYYY HH:MI AM') )) AS Hours FROM Table1;
- 如果需要保留小数小时(比如半小时),可以用
EXTRACT(EPOCH FROM (...))/3600计算精确时长,再按需取整
Oracle 实现方式
将拼接字符串转为DATE类型,日期相减得到天数后乘以24转为小时数:
SELECT ID, Name, Class, Date, Intime, Outtime, (TO_DATE(CONCAT(Date, ' ', Outtime), 'MM-DD-YYYY HH:MI AM') - TO_DATE(CONCAT(Date, ' ', Intime), 'MM-DD-YYYY HH:MI AM')) * 24 AS Hours FROM Table1;
- Oracle中日期类型相减的结果是天数,乘以24即可转换为小时数
注意事项
- 上述方法均结合了
Date列,能避免跨天场景下的计算错误(比如Outtime为次日凌晨的情况) - 如果
Intime/Outtime本身已是时间类型(而非字符串),可省略字符串拼接步骤,直接结合Date列构造完整日期时间进行计算
内容的提问来源于stack exchange,提问作者Smith
相关产品推荐
相关产品推荐

