如何在SQL中提取'Monday|7:00-17:00'格式的起止时间并计算时长?
在SQL中提取时间区间并计算小时差
针对Monday|7:00-17:00这类格式的文本,核心思路是通过分隔符定位分割点,避开星期字符串长度不一致的问题,步骤如下:
通用逻辑
- 先提取
|右侧的时间区间部分(如7:00-17:00) - 再用
-拆分出开始时间和结束时间 - 将时间字符串转为时间类型后,计算两者的小时差
以下是主流SQL方言的具体实现:
MySQL
SELECT your_column, TIMESTAMPDIFF(HOUR, STR_TO_DATE(SUBSTRING_INDEX(SUBSTRING_INDEX(your_column, '|', -1), '-', 1), '%H:%i'), STR_TO_DATE(SUBSTRING_INDEX(SUBSTRING_INDEX(your_column, '|', -1), '-', -1), '%H:%i') ) AS hour_difference FROM your_table;
SUBSTRING_INDEX(your_column, '|', -1):取出|右侧的全部内容STR_TO_DATE:将时间字符串转为时间类型TIMESTAMPDIFF:直接计算两个时间的小时差
PostgreSQL
SELECT your_column, EXTRACT(EPOCH FROM ( TO_TIMESTAMP(split_part(split_part(your_column, '|', 2), '-', 2), 'HH24:MI') - TO_TIMESTAMP(split_part(split_part(your_column, '|', 2), '-', 1), 'HH24:MI') )) / 3600 AS hour_difference FROM your_table;
split_part(your_column, '|', 2):提取|后的时间区间TO_TIMESTAMP:转换时间字符串为时间戳- 通过计算时间戳差值,转成小时数(1小时=3600秒)
SQL Server
SELECT your_column, DATEDIFF(HOUR, CAST(LEFT(time_segment, CHARINDEX('-', time_segment) - 1) AS TIME), CAST(RIGHT(time_segment, LEN(time_segment) - CHARINDEX('-', time_segment)) AS TIME) ) AS hour_difference FROM ( SELECT your_column, RIGHT(your_column, LEN(your_column) - CHARINDEX('|', your_column)) AS time_segment FROM your_table ) temp;
- 子查询中用
RIGHT和CHARINDEX提取|后的时间区间 LEFT/RIGHT结合CHARINDEX拆分开始/结束时间DATEDIFF计算小时差
内容的提问来源于stack exchange,提问作者Den Lim
相关产品推荐
相关产品推荐

