SQL如何替换字符串列字符并将数值时长转为X天X小时格式
解决方案
核心逻辑:两个日期字段相减得到的差值单位为天,拆分整数部分为天数,再按需求换算/提取小时部分,拼接为指定格式即可,以下为不同场景的实现方案:
方案1:按实际时间换算(0.1天=2.4小时,四舍五入取整)
适用于需要真实反应住院时长的场景,以PostgreSQL为例(与原SQL语法兼容):
SELECT adm_no, p.patient_id, patient_fname, patient_lname, -- 拆分天和小时拼接输出 CONCAT( FLOOR(adm_discharge - adm_date_time)::INT, '天', ROUND( (adm_discharge - adm_date_time - FLOOR(adm_discharge - adm_date_time)) * 24 )::INT, '小时' ) AS lengthofstay FROM admission ad JOIN patient p ON ad.patient_id = p.patient_id WHERE ( adm_discharge - adm_date_time) > (select avg(adm_discharge - adm_date_time) from admission) AND adm_discharge IS NOT NULL ORDER BY adm_no;
方案2:直接拆分原小数格式(7.1直接输出7天1小时)
完全匹配你举例的转换规则,把保留1位小数的结果直接按小数点拆分拼接:
SELECT adm_no, p.patient_id, patient_fname, patient_lname, CONCAT( SPLIT_PART(to_char(round(( adm_discharge - adm_date_time ),1)), '.', 1), '天', SPLIT_PART(to_char(round(( adm_discharge - adm_date_time ),1)), '.', 2), '小时' ) AS lengthofstay FROM admission ad JOIN patient p ON ad.patient_id = p.patient_id WHERE ( adm_discharge - adm_date_time) > (select avg(adm_discharge - adm_date_time) from admission) AND adm_discharge IS NOT NULL ORDER BY adm_no;
MySQL适配版本
如果使用MySQL数据库,可以用以下写法直接按实际小时数拆分计算:
SELECT adm_no, p.patient_id, patient_fname, patient_lname, CONCAT( FLOOR(TIMESTAMPDIFF(HOUR, adm_date_time, adm_discharge)/24), '天', MOD(TIMESTAMPDIFF(HOUR, adm_date_time, adm_discharge), 24), '小时' ) AS lengthofstay FROM admission ad JOIN patient p ON ad.patient_id = p.patient_id WHERE TIMESTAMPDIFF(HOUR, adm_date_time, adm_discharge)/24 > (select avg(TIMESTAMPDIFF(HOUR, adm_date_time, adm_discharge)/24) from admission) AND adm_discharge IS NOT NULL ORDER BY adm_no;
内容的提问来源于stack exchange,提问作者Vansh Sirohi
相关产品推荐
相关产品推荐

