计算公式
极态计算公式引擎支持的函数涵盖行内公式函数(数值计算、日期处理、文本操作、逻辑判断)和数据库列统计函数。所有函数名称均采用全大写格式。
本文档按函数类别划分章节,每个函数均提供参数说明、功能描述及调用示例。
核心概念
行内公式
- 配置位置:数据类型字段的
formula属性(字符串类型) - 语法示例:
"MAX(F('f1'), F('f2')) + 100" - 转换逻辑:ORM 解析时自动转换为 SQL 表达式
- 特点:支持嵌套函数调用和四则运算
列统计函数
- 配置位置:Select 表达式中的
Formula对象 - 语法示例:
Select([F(Formula('COLSUM(F("f1"))'))], From(...)) - 转换逻辑:生成聚合查询 SQL(如
SUM(f1))
通用规则
- 函数名称必须 全大写
- 字段引用格式:
F('字段ID') - 支持常量数值和基础运算符(
+,-,*,/)
配置示例
行内公式配置
# 数据类型定义
NumberField(
name="综合评分",
# 自动计算:(业务能力 + 沟通能力) / 2,并保留 1 位小数
formula="ROUND(AVG(F('业务能力'), F('沟通能力')), 1)"
)
生成的 SQL 示例:
SELECT ROUND(AVG(业务能力 + 沟通能力)/2, 1) AS 综合评分
列统计配置
# 通过 queryset 直接查询数字字段统计
model.queryset.select(F(Formula("COLSUM(F(\"score\"))"), "total")).all()
# Select 表达式 (用于统计图表或者聚合表)
select = Select([
F(Formula('COLAVG(F("score"))')),
F(Formula('COLMAX(F("age"))'))
],
From(['user_table', "u"])
)
生成的 SQL 示例:
SELECT AVG(score), MAX(age) FROM user_table as u
函数速查表
行内公式函数
数值计算
| 函数 | 参数 | 描述 | 示例 |
|---|---|---|---|
MAX | 1-10个参数 | 取所有参数中最大的数值 | MAX(2,4,3) = 4 |
MIN | 1-10个参数 | 取所有参数中最小的数值 | MIN(2,4,3) = 2 |
AVG | 1-10个参数 | 取所有参数的平均数 | AVG(2,4,3) = 3 |
SUM | 1-10个参数 | 取所有参数的和 | SUM(2,4,3) = 9 |
ROUND | 数值, 小数位 | 根据小数位数,返回数值四舍五入后的值 | ROUND(2.456, 2) = 2.46 |
TRUNCATE | 数值, 小数位 | 根据小数位数,返回数值截断后的值(不四舍五入) | TRUNCATE(2.456, 2) = 2.45 |
POWER | 数值, 指数 | 乘幂,返回数值的指数次方 | POWER(3, 2) = 9 |
ABS | 数值 | 返回数值的绝对值 | ABS(-4) = 4 |
MOD | 被除数, 除数 | 取余数 | MOD(10,4) = 2 |
RANDOM | 最小值, 最大值, 小数位 | 取最小值与最大值之间的指定小数位数的随机实数 | RANDOM(1, 10, 1) = 2.5 |
日期处理
| 函数 | 参数 | 描述 | 示例 |
|---|---|---|---|
NOW | 无 | 返回当前时间(年月日时分秒) | NOW() = 2022-01-28 12:12:12 |
TODAY | 无 | 返回今天的时间(年月日) | TODAY() = 2022-01-28 |
DATESTR | 日期 | 将日期转为字符串 | DATESTR(2022-01-28) = "20220128" |
EXTRACT | 日期, 单位 | 取日期的年/月/日。单位可选:'Y', 'M', 'D' | EXTRACT(2022-01-28, 'Y') = 2022 |
DATEDELTA | 日期1, 日期2, 单位 | 取日期1-日期2的差值 | DATEDELTA(2022-01-28, 2022-01-22, 'D') = 6 |
DATEADD | 日期, 数值, 单位 | 返回日期加上相应数值单位后的日期 | DATEADD(2022-01-28, 2, 'D') = 2022-01-30 |
MONTHDAYS | 日期 | 返回日期对应月份有多少天 | MONTHDAYS(2022-01-28) = 31 |
DAYOFYEAR | 日期 | 返回日期当年的第几天 | DAYOFYEAR(2022-01-28) = 28 |
WEEKOFYEAR | 日期 | 返回日期当年的第几周 | WEEKOFYEAR(2022-01-28) = 5 |
DATE | 年, 月, 日 | 将年,月,日转成日期 | DATE(2022, 1, 28) = 2022-01-28 |
WEEKDAYNUM | 日期 | 返回日期是星期几(数字) | WEEKDAYNUM(2022-01-28) = 6 |
WEEKDAYSTR | 日期 | 返回日期是星期几(文本) | WEEKDAYSTR(2022-01-28) = '星期六' |
MONTHSTART | 日期 | 返回日期当月第一天 | MONTHSTART(2022-01-28) = 2022-01-01 |
MONTHEND | 日期 | 返回日期当月最后一天 | MONTHEND(2022-01-28) = 2022-01-31 |
YEAR | 字段 | 转成年初 | YEAR(2023-12-31) = 2023-01-01 |
YEARQUARTER | 字段 | 转成季度初 | YEARQUARTER(2023-12-31) = 2023-10-01 |
YEARMONTH | 字段 | 转成月初 | YEARMONTH(2023-12-31) = 2023-12-01 |
YEARWEEK | 字段 | 转成周一 | YEARWEEK(2023-2-2) = 2023-1-30 |
YEARMONTHDAY | 字段 | 取日期字段的日 | YEARWEEK(2023-1-1 12:12:12) = 2023-1-1 |
文本操作
| 函数 | 参数 | 描述 | 示例 |
|---|---|---|---|
CONCAT | 至少2个参数 | 拼接多个文本 | CONCAT('a', 'b', 'c') = "abc" |
REPLACE | 原文, 匹配项, 替换项 | 将原文本中的查找到的匹配文本全部替换为新文本 | REPLACE('abc', 'b', 'x') = "axc" |
INSERT | 原文, 位置, 长度, 新文 | 从指定位置开始,将指定长度的字符替换为新文本 | INSERT('abc', 2, 2, 'xx') = "axx" |
LEFT | 文本, 长度 | 从左截取相应字符数 | LEFT('abc', 2) = "ab" |
RIGHT | 文本, 长度 | 从右截取相应字符数 | RIGHT('abc', 2) = "bc" |
MID | 文本, 位置, 长度 | 从指定位置开始,截取指定长度的字符 | MID('abcd', 2, 3) = "bcd" |
LEN | 文本 | 返回文本字符长度 | LEN('abcd') = 4 |
TRIM | 文本 | 去掉文本首尾的空格 | TRIM(' abcd ') = "abcd" |
LOCATE | 子文本, 文本 | 返回文本是否包含子文本(Boolean) | LOCATE('a', 'abc') = True |
IDCARDBIRTHDAY | 身份证号 | 返回身份证号对应的出生日期 | IDCARDBIRTHDAY('...') = 1999-03-02 |
IDCARDSEX | 身份证号 | 返回身份证号对应的性别 | IDCARDSEX('...') = "男" |
逻辑判断
| 函数 | 参数 | 描述 | 示例 |
|---|---|---|---|
IF | 条件, 真值, 假值 | 满足条件返回真值,否则返回假值 | IF(2>1, 3, 2) = 3 |
IFS | (条件, 值)..., 默认 | 检查多个条件,返回第一个 True 对应的值 | IFS(3>2, 0, 2>2, 1, 2) = 0 |
AND | 1-10个条件 | 所有条件都满足则为真 | AND(2>1, 3>1) = True |
OR | 1-10个条件 | 任一条件满足则为真 | OR(2>1, 0>1) = True |
EMPTY | 无 | 返回空值 (None) | EMPTY() = None |
ISEMPTY | 表达式 | 表达式为空则为真 | ISEMPTY(1) = False |
ISNOTEMPTY | 表达式 | 表达式不为空则为真 | ISNOTEMPTY(1) = True |
EMPTYSTR | 无 | 返回空字符串 | EMPTYSTR() = "" |
DEFAULTVALUE | 数值, 默认值 | 数值为空则返回默认值 | DEFAULTVALUE(None, 2) = 2 |
数据库列函数
配置在 Select 表达式中,用于聚合统计。
| 函数 | 参数 | 描述 |
|---|---|---|
COLSUM | 字段 | 求满足条件该列的和 |
COLAVG | 字段 | 求满足条件该列的平均值 |
COLMAX | 字段 | 求满足条件该列的最大值 |
COLMIN | 字段 | 求满足条件该列的最小值 |
COUNT | 字段 | 求满足条件该列的非空计数 |
DISTINCT | 字段 | 求满足条件该列的去重计数 |
STDDEV | 字段 | 求满足条件该列的标准差 |
VARIANCE | 字段 | 求满足条件该列的方差 |
MEDIAN | 字段 | 求满足条件该列的中位数 |
FILL | 字段 | 求满足条件该列的非 Null 计数 |
NOTFILL | 字段 | 求满足条件该列的 Null 计数 |
COUNTFIELD | 字段 | 求满足条件该列的非 Null 计数 (同 COUNT) |
SELECTED | 字段 | 求满足条件该列的已选计数 (通常用于多选字段) |
NOTSELECTED | 字段 | 求满足条件该列的未选计数 |
高级用法
多函数嵌套
# 判断销售额是否达标,并拼接部门名称
"""
IF(COLSUM(F('sales')) > 100000,
CONCAT('达标:', F('dept')),
CONCAT('未达标:', F('dept')))
"""
混合运算
# 计算折扣后的总价
"(F('price') * F('quantity')) - DISCOUNT(F('vip_level'))"
注意事项
语法规范
- 字段引用:必须使用
F('字段ID')格式。 - 字符串参数:需使用单引号包裹,例如
CONCAT(F('姓'), '·', F('名'))。 - 日期格式:日期字面量需符合 ISO 格式,例如
DATE('2023-12-31')。 - 聚合限制:聚合函数不能嵌套使用。
- 空值处理:建议使用
DEFAULTVALUE处理可能的空值,例如DEFAULTVALUE(F('score'), 0)。