You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

将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就是四舍五入后的百分比数值,一步替代嵌套IIF
  • RPAD(..., 100, ' '):把进度条补到固定100字符长度,方便在LibreOffice Base表单里对齐展示
  • COALESCE(..., 0):避免没有工时数据时出现NULL值,确保百分比和进度条能正常生成
  • 若要更紧凑的进度条(比如20字符代表100%),只需把百分比除以5取整,示例:REPEAT('▓', ROUND((Total28 / LEGAL_MAX_28) * 20))

内容的提问来源于stack exchange,提问作者hiigaran

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 06:50:46