将Firebird查询返回的百分比转换为ASCII文本进度条
Firebird生成ASCII进度条的优雅实现
不用写100个嵌套IIF,Firebird的REPEAT()函数就能直接生成重复的▓字符,配合百分比计算就能搞定进度条。下面是改造后的查询,包含时长统计、百分比计算和进度条生成:
WITH DutyTotals AS ( SELECT -- 计算过去28天总工时,无数据时返回0避免NULL COALESCE(SUM("Day" + "Night"), 0) AS Total28, -- 计算过去365天总工时,无数据时返回0避免NULL COALESCE((SELECT SUM("Day" + "Night") FROM "Duty" WHERE "Date" > DATEADD(DAY, -365, CURRENT_TIMESTAMP)), 0) AS Total365 FROM "Duty" WHERE "Date" > DATEADD(DAY, -28, CURRENT_TIMESTAMP) ) SELECT Total28 AS "Hours Last 28 Days", -- 替换LEGAL_MAX_28为28天的法定最大工时(比如168) ROUND((Total28 / LEGAL_MAX_28) * 100) AS "Percent 28 Days", -- 生成100字符长度的进度条,▓代表已占比,空格补全对齐 RPAD(REPEAT('▓', ROUND((Total28 / LEGAL_MAX_28) * 100)), 100, ' ') AS "Progress 28 Days", Total365 AS "Hours Last 365 Days", -- 替换LEGAL_MAX_365为365天的法定最大工时(比如2080) ROUND((Total365 / LEGAL_MAX_365) * 100) AS "Percent 365 Days", RPAD(REPEAT('▓', ROUND((Total365 / LEGAL_MAX_365) * 100)), 100, ' ') AS "Progress 365 Days" FROM DutyTotals
关键细节说明:
REPEAT('▓', N):直接生成N个▓字符,N就是四舍五入后的百分比数值,一步替代嵌套IIFRPAD(..., 100, ' '):把进度条补到固定100字符长度,方便在LibreOffice Base表单里对齐展示COALESCE(..., 0):避免没有工时数据时出现NULL值,确保百分比和进度条能正常生成- 若要更紧凑的进度条(比如20字符代表100%),只需把百分比除以5取整,示例:
REPEAT('▓', ROUND((Total28 / LEGAL_MAX_28) * 20))
内容的提问来源于stack exchange,提问作者hiigaran
相关产品推荐
相关产品推荐

