如何查询时长不足1小时的戏剧并生成under_hour标记列
如何判断戏剧时长是否不足1小时并生成目标结果集?
我来给你一步步拆解实现方法,帮你得到需要的结果集:
核心思路
我们需要先从原始数据里提取每部戏剧的开始时间和结束时间,然后计算两者的时间差,最后根据差值是否小于1小时来标记under_hour的取值。
通用SQL实现方案
假设你的数据表名为play_schedule,包含Play_name、Status、Date这几列(注意Date是SQL关键字,建议用反引号/双引号包裹)。下面是具体的SQL代码:
SELECT Play_name, CASE -- 计算分钟差,小于60分钟则标记为Yes,否则NO WHEN TIMESTAMPDIFF(MINUTE, start_time, end_time) < 60 THEN 'Yes' ELSE 'NO' END AS under_hour FROM ( -- 子查询:提取每部戏剧的开始和结束时间 SELECT Play_name, -- 拿到Start状态对应的时间 MAX(CASE WHEN Status = 'Start' THEN `Date` END) AS start_time, -- 拿到END状态对应的时间 MAX(CASE WHEN Status = 'END' THEN `Date` END) AS end_time FROM play_schedule -- 过滤掉Break状态,我们只需要开始和结束时间 WHERE Status IN ('Start', 'END') -- 按戏剧名称分组,确保每部戏剧只取一组开始/结束时间 GROUP BY Play_name ) AS play_times;
针对不同数据库的调整
如果你的数据库不是MySQL,比如PostgreSQL,可以用时间差的提取函数来替代TIMESTAMPDIFF:
SELECT Play_name, CASE WHEN EXTRACT(EPOCH FROM (end_time - start_time)) / 60 < 60 THEN 'Yes' ELSE 'NO' END AS under_hour FROM ( SELECT Play_name, MAX(CASE WHEN Status = 'Start' THEN "Date" END) AS start_time, MAX(CASE WHEN Status = 'END' THEN "Date" END) AS end_time FROM play_schedule WHERE Status IN ('Start', 'END') GROUP BY Play_name ) AS play_times;
补充说明
- 如果同一部戏剧有多场演出(即多个Start/END对),你需要额外添加场次标识来分组,避免时间计算混乱。
- 示例中用
MAX函数提取时间是因为每部戏剧对应唯一的Start和END记录,用MIN也能达到同样效果。
内容的提问来源于stack exchange,提问作者Doniu
相关产品推荐
相关产品推荐

