跳到主要内容

计算公式

极态计算公式引擎支持的函数涵盖行内公式函数(数值计算、日期处理、文本操作、逻辑判断)和数据库列统计函数。所有函数名称均采用全大写格式。

本文档按函数类别划分章节,每个函数均提供参数说明、功能描述及调用示例。

核心概念

行内公式

  • 配置位置:数据类型字段的 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

函数速查表

行内公式函数

数值计算

函数参数描述示例
MAX1-10个参数取所有参数中最大的数值MAX(2,4,3) = 4
MIN1-10个参数取所有参数中最小的数值MIN(2,4,3) = 2
AVG1-10个参数取所有参数的平均数AVG(2,4,3) = 3
SUM1-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
AND1-10个条件所有条件都满足则为真AND(2>1, 3>1) = True
OR1-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'))"

注意事项

语法规范
  1. 字段引用:必须使用 F('字段ID') 格式。
  2. 字符串参数:需使用单引号包裹,例如 CONCAT(F('姓'), '·', F('名'))
  3. 日期格式:日期字面量需符合 ISO 格式,例如 DATE('2023-12-31')
  4. 聚合限制:聚合函数不能嵌套使用。
  5. 空值处理:建议使用 DEFAULTVALUE 处理可能的空值,例如 DEFAULTVALUE(F('score'), 0)